Sales

sale
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/19.0/sale
VERSION
VERSION 1.2
CATEGORY
CATEGORYSales/Sales
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo S.A.
MAINTAINERS
MAINTAINERSOdoo S.A.
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Thibault Delavallée, Josse Colpaert, Alexis de Lattre, Xavier ALT, Joren Van Onder, qdp-odoo, Géry Debongnie, Aaron Bohy, Laurent Smet, Alexandre Kühn, Arnold Moyaux, Julien Castiaux, Victor Feyens, Andrea Grazioso (agr-odoo), Julien Mougenot, Anh Thao Pham (pta), svs-odoo, Achraf (abz), Prakash Prajapati, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, Mathieu Duckerts-Antoine, abd-msyukyu-odoo, Arnaud Joset, William Braeckman, odoo, Benoit Socias, Miquel Raïch, william-andre, Víctor Martínez, John Laterre (jol), Antoine Vandevenne (anv), Demesmaeker, Aurelien van Delft (avd), luvi, Valentin Chevalier, Renaud Thiry, Julien Banken, Pierrot (prro), jbw-odoo, Habib (ayh), alsh-odoo, Louis Wicket (wil), Maximilien (malb), Victor Piryns (pivi), Gauthier Wala (gawa), clesgow, Pieter Claeys (clpi), Andrew Gavgavian, pash-odoo, Levi Siuzdak (sile), Antoine Dupuis (andu), Dylan Kiss (dyki), Julien Alardot (jual), Valeriya(vchu), Anita (anko), Sarah Bellefroid, Arnaud Sibille, Nicolas Viseur (vin), Walid (wasa), stefanorigano (SRI), Quentin Wolfs, Louis (loti), jorv-odoo, Maxime de Neuville, reka-odoo, yosa-odoo, Mohamed GadAlrab, Julien Carion (juca), kcv-odoo, odoostan, Tanguy Quéguineur, dere-odoo, Lina (liew), Chrysanthe (chgo), sami odoo, Junqi Wu, mano-odoo, aamo-odoo, Mathieu Coutant, Patricia Daloze (pda), Xavier Luyckx (xlu), guce, Stéphane Diez, dhha-odoo, Ryan Cen, casp-odoo, Antoine (anso), Manushi Shah, Antoine Dupuis, Pierre Pulinckx (PIPU), dija-odoo, AhmedElemary57, Smit Patel, Trinh Ngoc Hung, Maira Salazar (srma), st-yes, David Van Droogenbroeck (DROD), Mohammad Abdulmoneim (abdu), khsr-odoo, Pierre Lamotte (pila), Michaël Mattiello, Pierre Pulinckx, Bastien PIERRE, Anton Romanova (roan), jeep-odoo, Corentin Heinix (cohe), Corentin Lombard, ppat-odoo, zel-odoo, Carmine, Shrey Mehta, Sherif Gabr, bona-odoo, plha-odoo, lse-odoo, Thomas Josse (THJO), Krzysztof Magusiak (krma), Mahdi Alijani (malj), Omar (OSAH), nipl-odoo, Ajit Singh, Armin-FalDiS, Franco Leyes, Hembert Iregui, krip-odoo, hatr-odoo, Basioni (basm), utma-odoo, Maeva De Keyser (MDEK), Tyler Landivar (tylan), nsirjacobs, bhra-odoo, defl, bhna-odoo, rare-odoo, aksi-odoo, Lulu Grimalkin (lugr), igbe, Lancelot Semal, Laurent Smet (LAS), path-odoo, Amr Elkhatieb, Nisarg (nipl), assh-odoo, Elliot ELCO, cro, livaios, Lionel Piraux (lipi), Leila Kerroum Balaguer, Waleed Elgamal, Merlin Guillaume, YoussefM890, Mazen, saurabh, Julien Hémono, pkri-odoo, jand-odoo, Julien (jdeh), Zachary (zavan), khaj-odoo, chpa-odoo, Romain ROSANO (rros), dabo-odoo, mson-odoo
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:51:43
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - 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
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module contains all the common features of Sales Management and eCommerce.
    

Code Analysis

Views touched (73)
XML IDNameModelTypeStatus
account_invoice_form Account Invoice account.move xpath Inherits account.view_move_form
account_invoice_groupby_inherit account.move.groupby account.move field Inherits account.view_account_invoice_filter
account_invoice_report_view_tree account.invoice.report.view.list.inherit.sale account.invoice.report field Inherits account.account_invoice_report_view_tree
account_invoice_view_tree account.move.list.inherit.sale account.move field Inherits account.view_invoice_tree
crm_team_salesteams_view_form crm.team.form crm.team field Inherits sales_team.crm_team_view_form
crm_team_view_kanban_dashboard crm.team.view.kanban.dashboard.inherit.sale crm.team xpath Inherits sales_team.crm_team_view_kanban_dashboard
document_tax_totals document_tax_totals ir.ui.view qweb Inherits account.document_tax_totals_template
mass_cancel_orders_view_form sale.mass.cancel.orders.form sale.mass.cancel.orders form New
payment_link_wizard_view_form payment.link.wizard.form payment.link.wizard field Inherits payment.payment_link_wizard_view_form
payment_provider_form payment.provider.form.inherit.sale payment.provider group Inherits payment.payment_provider_form
portal_my_home_menu_sale Portal layout : sales menu entries ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home_sale Quotations / Sales Orders ir.ui.view qweb Inherits portal.portal_my_home
portal_my_orders My Sales Orders ir.ui.view qweb New
portal_my_quotations My Quotations ir.ui.view qweb New
product_document_form product.document.form.sale product.document sheet Inherits product.product_document_form
product_document_kanban product.document.kanban.sale product.document xpath Inherits product.product_document_kanban
product_document_list product.document.list.sale product.document field Inherits product.product_document_list
product_document_search product.document.search.sale product.document search Inherits product.product_document_search
product_form_view_sale_order_button product.product.sale.order product.product div Inherits product.product_normal_form_view
product_pricelist_item_form product.pricelist.item.view.form.inherit product.pricelist.item group Inherits product.product_pricelist_item_form_view
product_template_form_view product.template.form.view.inherit.sale product.template page Inherits product.product_template_form_view
product_template_form_view_sale_order_button product.template.sale.order.button product.template button Inherits product.product_template_only_form_view
product_template_view_form product.template.form.inherit.sale.product.configurator product.template group Inherits product.product_template_form_view
product_view_kanban_catalog product.view.kanban.catalog.inherit.sale product.product xpath Inherits product.product_view_kanban_catalog
product_view_search_catalog product.view.search.catalog.inherit.sale product.product filter Inherits product.product_view_search_catalog
quote_document_layout_preview quote_document_layout_preview ir.ui.view qweb New
report_saleorder report_saleorder ir.ui.view qweb New
report_saleorder_document report_saleorder_document ir.ui.view qweb New
report_saleorder_pro_forma report_saleorder_pro_forma ir.ui.view qweb New
report_saleorder_raw report_saleorder_raw ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.sale res.config.settings xpath Inherits base.res_config_settings_view_form
res_config_settings_view_form_sale_inherit res.config.settings.view.form.inherit.sale res.config.settings xpath Inherits account.res_config_settings_view_form
res_partner_view_buttons res.partner.view.buttons res.partner div Inherits base.view_partner_form
res_partner_view_form_payment_defaultcreditcard res.partner.view.form.payment.defaultcreditcard res.partner button Inherits payment.view_partners_form_payment_defaultcreditcard
res_partner_view_form_property_inherit res.partner.view.form.property.inherit res.partner group Inherits account.view_partner_property_form
sale_order_kanban_upload sale.order.kanban.upload (orders) sale.order kanban Inherits view_sale_order_kanban
sale_order_line_view_form_readonly sale.order.line.form.readonly sale.order.line form New
sale_order_line_view_kanban sale.order.line.kanban sale.order.line kanban New
sale_order_line_wizard_form sale.order.discount.form sale.order.discount form New
sale_order_list_upload sale.order.tree.upload (orders) sale.order list Inherits view_order_tree
sale_order_portal_content Sales Order Portal Content ir.ui.view qweb New
sale_order_portal_content_totals_table sale_order_portal_content_totals_table ir.ui.view qweb New
sale_order_portal_pay_modal Sales Order Portal Pay Modal ir.ui.view qweb New
sale_order_portal_pay_modal_amount_selector Sales Order Portal Pay Modal Amounts Selector ir.ui.view qweb New
sale_order_portal_sign_modal Sales Order Portal Sign Modal ir.ui.view qweb New
sale_order_portal_template Sales Order ir.ui.view qweb Inherits portal.portal_sidebar
sale_order_tree sale.order.list sale.order list New
sale_order_view_activity sale.order.activity sale.order activity New
sale_order_view_search_inherit_quotation sale.order.search.inherit.quotation sale.order filter Inherits sale.view_sales_order_filter
sale_order_view_search_inherit_sale sale.order.search.inherit.sale sale.order filter Inherits sale.view_sales_order_filter
sale_report_graph_bar sale.report.graph.bar sale.report graph Inherits view_order_product_graph
sale_report_graph_pie sale.report.graph.pie sale.report graph Inherits view_order_product_graph
sale_report_view_tree sale.report.view.list sale.report list New
transaction_form_inherit_sale payment.transaction.form.inherit.sale.payment payment.transaction xpath Inherits payment.payment_transaction_form
utm_campaign_view_form utm.campaign.view.form utm.campaign xpath Inherits utm.utm_campaign_view_form
utm_campaign_view_kanban utm.campaign.view.kanban utm.campaign xpath Inherits utm.utm_campaign_view_kanban
view_account_invoice_report_search_inherit account.invoice.report.search.inherit account.invoice.report filter Inherits account.view_account_invoice_report_search
view_order_form sale.order.form sale.order form New
view_order_line_tree sale.order.line.list sale.order.line list New
view_order_product_graph sale.report.graph sale.report graph New
view_order_product_pivot sale.report.pivot sale.report pivot New
view_order_product_search sale.report.search sale.report search New
view_order_tree sale.order.list (orders) sale.order list Inherits sale_order_tree
view_quotation_kanban_with_onboarding sale.order.kanban sale.order kanban Inherits view_sale_order_kanban
view_quotation_tree sale.order.list (quotes) sale.order list Inherits sale_order_tree
view_quotation_tree_with_onboarding sale.order.list sale.order list Inherits view_quotation_tree
view_sale_advance_payment_inv Invoice Orders sale.advance.payment.inv form New
view_sale_order_calendar sale.order.calendar sale.order calendar New
view_sale_order_graph sale.order.graph sale.order graph New
view_sale_order_kanban sale.order.kanban sale.order kanban New
view_sale_order_pivot sale.order.pivot sale.order pivot New
view_sales_order_filter sale.order.list.select sale.order search New
view_sales_order_line_filter sale.order.line.select sale.order.line search New
Models touched (28)

New fields (1)
  • business_domain Selection
    ondelete={'sale_order': 'cascade'} selection_add=[('sale_order', 'Sale Order')]
Public methods (0)

No public methods.

New fields (1)
  • so_line Many2one → sale.order.line
    domain=[('qty_delivered_method', '=', 'analytic')] index='btree_not_null' string='Sales Order Item' args: 'sale.order.line'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • team_id Many2one → crm.team
    comodel_name='crm.team' string='Sales Team'
Public methods (0)

No public methods.

New fields (6)
  • campaign_id Many2one
    ondelete='set null'
  • medium_id Many2one
    ondelete='set null'
  • sale_order_count Integer
    compute='_compute_origin_so_count' compute_sudo=True string='Sale Order Count'
  • sale_warning_text Text
    compute='_compute_sale_warning_text' help='Internal warning for the partner or the products as set by the user.' args: 'Sale Warning'
  • source_id Many2one
    ondelete='set null'
  • team_id Many2one → crm.team
    compute='_compute_team_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" ondelete='set null' readonly=False store=True string='Sales Team' tracking=True args: 'crm.team'
Public methods (5)
  • action_post(self)
  • action_view_source_sale_orders(self)
  • button_cancel(self)
  • button_draft(self)
  • unlink(self)

New fields (3)
  • is_downpayment Boolean
  • sale_line_ids Many2many → sale.order.line
    copy=False readonly=True string='Sales Order Lines' args: 'sale.order.line', 'sale_order_line_invoice_rel', 'invoice_line_id', 'order_line_id'
  • sale_line_warn_msg Text
    compute='_compute_sale_line_warn_msg'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • invoiced Float
    compute='_compute_invoiced' help='Invoice revenue for the current month. This is the amount the sales channel has invoiced this month. It is used to compute the progression ratio of the current and target revenue on the kanban view.' readonly=True string='Invoiced This Month'
  • invoiced_target Float
    help='Revenue Target for the current month (untaxed total of paid invoices).' string='Invoicing Target'
  • sale_order_count Integer
    compute='_compute_sale_order_count' string='# Sale Orders'
Public methods (2)
  • action_primary_channel_button(self)
  • update_invoiced_target(self, value)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)
  • write(self, vals)

New fields (3)
  • amount_paid Monetary
    readonly=True string='Already Paid'
  • confirmation_message Char
    compute='_compute_confirmation_message' string='Confirmation Message'
  • prepayment_amount Monetary
    currency_field='currency_id' string='Prepayment Amount'
Public methods (0)

No public methods.

New fields (1)
  • so_reference_type Selection
    default='so_name' help='You can set here the communication type that will appear on sales orders.The communication will be given to the customer when they choose the payment method.' selection=[('so_name', 'Based on Document Reference'), ('partner', 'Based on Customer ID')] string='Communication'
Public methods (0)

No public methods.

New fields (2)
  • sale_order_ids Many2many → sale.order
    copy=False readonly=True string='Sales Orders' args: 'sale.order', 'sale_order_transaction_rel', 'transaction_id', 'sale_order_id'
  • sale_order_ids_nbr Integer
    compute='_compute_sale_order_ids_nbr' string='# of Sales Orders'
Public methods (1)
  • action_view_sales_orders(self)
    @api.readonly

New fields (1)
  • sale_order_line_id Many2one → sale.order.line
    index='btree_not_null' ondelete='cascade' string='Sales Order Line' args: 'sale.order.line'
Public methods (0)

No public methods.

New fields (1)
  • attached_on_sale Selection
    default='hidden' groups='sales_team.group_sale_salesman' help='Allows you to share the document with your customers within a sale.\nOn quote: the document will be sent to and accessible by customers at any time.\ne.g. this option can be useful to share Product description files.\nOn order confirmation: the document will be sent to and accessible by customers.\ne.g. this option can be useful to share User Manual or digital content bought on ecommerce. ' required=True selection=[('hidden', 'Hidden'), ('quotation', 'On quote'), ('sale_order', 'On confirmed order')] string='Sale : Visible at'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • product_catalog_product_is_in_sale_order Boolean
    compute='_compute_product_is_in_sale_order' search='_search_product_is_in_sale_order'
  • sales_count Float
    compute='_compute_sales_count' digits='Product Unit' string='Sold'
Public methods (1)
  • action_view_sales(self)
    @api.readonly

New fields (7)
  • expense_policy Selection
    compute='_compute_expense_policy' default='no' help='Validated expenses, vendor bills, or stock pickings (set up to track costs) can be invoiced to the customer at either cost or sales price.' readonly=False selection=[('no', 'No'), ('cost', 'At cost'), ('sales_price', 'Sales price')] store=True string='Re-Invoice Costs'
  • invoice_policy Selection
    compute='_compute_invoice_policy' help='Ordered Quantity: Invoice quantities ordered by the customer.\nDelivered Quantity: Invoice quantities delivered to the customer.' precompute=True readonly=False selection=[('order', 'Ordered quantities'), ('delivery', 'Delivered quantities')] store=True string='Invoicing Policy' tracking=True
  • optional_product_ids Many2many → product.template
    check_company=True column1='src_id' column2='dest_id' comodel_name='product.template' help='Optional Products are suggested whenever the customer hits *Add to Cart* (cross-sell strategy, e.g. for computers: warranty, software, etc.).' relation='product_optional_rel' string='Optional Products'
  • sale_line_warn_msg Text
    string='Sales Order Line Warning'
  • sales_count Float
    compute='_compute_sales_count' digits='Product Unit' string='Sold'
  • service_type Selection
    compute='_compute_service_type' help='Manually set quantities on order: Invoice based on the manually entered quantity, without creating an analytic account.\nTimesheets on contract: Invoice based on the tracked hours on the related timesheet.\nCreate a task and track hours: Create a task on the sales order validation and track the work hours.' precompute=True readonly=False selection=[('manual', 'Manually set quantities on order')] store=True string='Track Service'
  • visible_expense_policy Boolean
    compute='_compute_visible_expense_policy' string='Re-Invoice Policy visible'
Public methods (3)
  • action_view_sales(self)
    @api.readonly
  • get_import_templates(self)
    @api.model
  • get_single_product_variant(self)
    Method used by the product configurator to check if the product is configurable or not. We need to open the product configurator if the product: - is configurable (see has_configurable_attributes) - has optional products

New fields (7)
  • downpayment_account_id Many2one → account.account
    comodel_name='account.account' domain=[('account_type', 'in', ('income', 'income_other', 'liability_current'))] help='This account will be used on Downpayment invoices.' string='Downpayment Account' tracking=True
  • portal_confirmation_pay Boolean
    string='Online Payment'
  • portal_confirmation_sign Boolean
    default=True string='Online Signature'
  • prepayment_percent Float
    default=1.0 help='The percentage of the amount needed to be paid to confirm quotations.' string='Prepayment percentage'
  • quotation_validity_days Integer
    default=30 help='Days between quotation proposal and expiration. 0 days means automatic expiration is disabled' string='Default Quotation Validity'
  • sale_discount_product_id Many2one → product.product
    check_company=True comodel_name='product.product' domain=[('type', '=', 'service'), ('invoice_policy', '=', 'order')] help='Default product used for discounts' string='Discount Product'
  • sale_onboarding_payment_method Selection
    selection=[('digital_signature', 'Sign online'), ('paypal', 'PayPal'), ('stripe', 'Stripe'), ('other', 'Pay with another payment provider'), ('manual', 'Manual Payment')] string='Sale onboarding selected payment method'
Public methods (0)

No public methods.

New fields (32)
  • automatic_invoice Boolean
    config_parameter='sale.automatic_invoice' help='The invoice is generated automatically and available in the customer portal when the transaction is confirmed by the payment provider.\nThe invoice is marked as paid and the payment is registered in the payment journal defined in the configuration of the payment provider.\nThis mode is advised if you issue the final invoice at the order and not after the delivery.' string='Automatic Invoice'
  • default_invoice_policy Selection
    default='order' default_model='product.template' selection=[('order', 'Invoice what is ordered'), ('delivery', 'Invoice what is delivered')] string='Invoicing Policy'
  • downpayment_account_id Many2one
    readonly=False related='company_id.downpayment_account_id'
  • group_auto_done_setting Boolean
    implied_group='sale.group_auto_done_setting' string='Lock Confirmed Sales'
  • group_discount_per_so_line Boolean
    implied_group='sale.group_discount_per_so_line' string='Discounts'
  • group_proforma_sales Boolean
    help='Allows you to send pro-forma invoice.' implied_group='sale.group_proforma_sales' string='Pro-Forma Invoice'
  • group_warning_sale Boolean
    implied_group='sale.group_warning_sale' string='Sale Order Warnings'
  • invoice_mail_template_id Many2one → mail.template
    comodel_name='mail.template' config_parameter='sale.default_invoice_email_template' domain=[('model', '=', 'account.move')] help='Email sent to the customer once the invoice is available.' string='Email Template'
  • module_delivery Boolean
    args: 'Delivery Methods'
  • module_delivery_bpost Boolean
    args: 'bpost Connector'
  • module_delivery_dhl Boolean
    args: 'DHL Express Connector'
  • module_delivery_easypost Boolean
    args: 'Easypost Connector'
  • module_delivery_envia Boolean
    args: 'Envia.com Connector'
  • module_delivery_fedex_rest Boolean
    args: 'FedEx Connector'
  • module_delivery_sendcloud Boolean
    args: 'Sendcloud Connector'
  • module_delivery_shiprocket Boolean
    args: 'Shiprocket Connector'
  • module_delivery_starshipit Boolean
    args: 'Starshipit Connector'
  • module_delivery_ups_rest Boolean
    args: 'UPS Connector'
  • module_delivery_usps_rest Boolean
    args: 'USPS Connector'
  • module_product_email_template Boolean
    args: 'Specific Email'
  • module_sale_amazon Boolean
    args: 'Amazon Sync'
  • module_sale_commission Boolean
    args: 'Commissions'
  • module_sale_gelato Boolean
    args: 'Gelato'
  • module_sale_loyalty Boolean
    args: 'Coupons & Loyalty'
  • module_sale_margin Boolean
    args: 'Margins'
  • module_sale_pdf_quote_builder Boolean
    args: 'PDF Quote builder'
  • module_sale_product_matrix Boolean
    args: 'Sales Grid Entry'
  • module_sale_shopee Boolean
    args: 'Shopee Sync'
  • portal_confirmation_pay Boolean
    readonly=False related='company_id.portal_confirmation_pay'
  • portal_confirmation_sign Boolean
    readonly=False related='company_id.portal_confirmation_sign'
  • prepayment_percent Float
    readonly=False related='company_id.prepayment_percent'
  • quotation_validity_days Integer
    readonly=False related='company_id.quotation_validity_days'
Public methods (2)
  • action_sale_start_payment_onboarding(self)
  • set_values(self)

New fields (3)
  • sale_order_count Integer
    compute='_compute_sale_order_count' groups='sales_team.group_sale_salesman' string='Sale Order Count'
  • sale_order_ids One2many → sale.order
    args: 'sale.order', 'partner_id', 'Sales Order'
  • sale_warn_msg Text
    args: 'Message for Sales Order'
Public methods (1)
  • can_edit_vat(self)
    Can't edit `vat` if there is (non draft) issued SO.

New fields (12)
  • advance_payment_method Selection
    default='delivered' help='A standard invoice is issued with all the order lines ready for invoicing,according to their invoicing policy (based on ordered or delivered quantity).' required=True selection=[('delivered', 'Regular invoice'), ('percentage', 'Down payment (percentage)'), ('fixed', 'Down payment (fixed amount)')] string='Create Invoice'
  • amount Float
    help='The percentage of amount to be invoiced in advance.' string='Down Payment'
  • amount_invoiced Monetary
    compute='_compute_invoice_amounts' help='Only confirmed down payments are considered.' string='Already invoiced'
  • company_id Many2one → res.company
    comodel_name='res.company' compute='_compute_company_id' store=True
  • consolidated_billing Boolean
    default=True help='Create one invoice for all orders related to same customer, same invoicing address and same delivery address.' string='Consolidated Billing'
  • count Integer
    compute='_compute_count' string='Order Count'
  • currency_id Many2one → res.currency
    comodel_name='res.currency' compute='_compute_currency_id' store=True
  • deduct_down_payments Boolean
    default=True string='Deduct down payments'
  • display_draft_invoice_warning Boolean
    compute='_compute_display_draft_invoice_warning'
  • fixed_amount Monetary
    help='The fixed amount to be invoiced in advance.' string='Down Payment Amount (Fixed)'
  • has_down_payments Boolean
    compute='_compute_has_down_payments' string='Has down payments'
  • sale_order_ids Many2many → sale.order
    default=<expr> args: 'sale.order'
Public methods (2)
  • create_invoices(self)
  • view_draft_invoices(self)

New fields (3)
  • has_confirmed_order Boolean
    compute='_compute_has_confirmed_order'
  • sale_order_ids Many2many → sale.order
    comodel_name='sale.order' default=<expr> relation='sale_order_mass_cancel_wizard_rel' string='Sale orders to cancel'
  • sale_orders_count Integer
    compute='_compute_sale_orders_count'
Public methods (1)
  • action_mass_cancel(self)

New fields (65)
  • amount_invoiced Monetary
    compute='_compute_amount_invoiced' string='Already invoiced'
  • amount_paid Float
    compute='_compute_amount_paid' compute_sudo=True help="Sum of transactions made in through the online payment form that are in the state 'done' or 'authorized' and linked to this order." string='Payment Transactions Amount'
  • amount_tax Monetary
    compute='_compute_amounts' store=True string='Taxes'
  • amount_to_invoice Monetary
    compute='_compute_amount_to_invoice' string='Un-invoiced Balance'
  • amount_total Monetary
    compute='_compute_amounts' store=True string='Total' tracking=4
  • amount_undiscounted Float
    compute='_compute_amount_undiscounted' digits=0 string='Amount Before Discount'
  • amount_untaxed Monetary
    compute='_compute_amounts' store=True string='Untaxed Amount' tracking=5
  • authorized_transaction_ids Many2many → payment.transaction
    comodel_name='payment.transaction' compute='_compute_authorized_transaction_ids' compute_sudo=True copy=False groups='account.group_account_invoice' string='Authorized Transactions'
  • campaign_id Many2one
    ondelete='set null'
  • client_order_ref Char
    copy=False string='Customer Reference'
  • commitment_date Datetime
    copy=False help='This is the delivery date promised to the customer. If set, the delivery order will be scheduled based on this date rather than product lead times.' string='Delivery Date'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> index=True required=True
  • company_price_include Selection
    related='company_id.account_price_include'
  • country_code Char
    related='company_id.account_fiscal_country_id.code' string='Country code'
  • create_date Datetime
    index=True readonly=True string='Creation Date'
  • currency_id Many2one → res.currency
    comodel_name='res.currency' compute='_compute_currency_id' ondelete='restrict' precompute=True store=True
  • currency_rate Float
    compute='_compute_currency_rate' digits=0 precompute=True store=True string='Currency Rate'
  • date_order Datetime
    copy=False default=fields.Datetime.now help='Creation date of draft/sent orders,\nConfirmation date of confirmed orders.' required=True string='Order Date'
  • duplicated_order_ids Many2many → sale.order
    comodel_name='sale.order' compute='_compute_duplicated_order_ids'
  • expected_date Datetime
    compute='_compute_expected_date' help='Delivery date you can promise to the customer, computed from the minimum lead time of the order lines.' store=False string='Expected Date'
  • fiscal_position_id Many2one → account.fiscal.position
    check_company=True comodel_name='account.fiscal.position' compute='_compute_fiscal_position_id' help='Fiscal positions are used to adapt taxes and accounts for particular customers or sales orders/invoices.The default value comes from the customer.' precompute=True readonly=False store=True string='Fiscal Position'
  • has_active_pricelist Boolean
    compute='_compute_has_active_pricelist'
  • has_archived_products Boolean
    compute='_compute_has_archived_products'
  • has_authorized_transaction_ids Boolean
    compute='_compute_authorized_transaction_ids' compute_sudo=True string='Has Authorized Transactions'
  • invoice_count Integer
    compute='_get_invoiced' string='Invoice Count'
  • invoice_ids Many2many → account.move
    comodel_name='account.move' compute='_get_invoiced' copy=False search='_search_invoice_ids' string='Invoices'
  • invoice_status Selection
    compute='_compute_invoice_status' selection=INVOICE_STATUS store=True string='Invoice Status'
  • is_expired Boolean
    compute='_compute_is_expired' string='Is Expired'
  • journal_id Many2one → account.journal
    check_company=True compute='_compute_journal_id' domain=[('type', '=', 'sale')] help='If set, the SO will invoice in this journal; otherwise the sales journal with the lowest sequence is used.' precompute=True readonly=False store=True string='Invoicing Journal' args: 'account.journal'
  • locked Boolean
    copy=False default=False help='Locked orders cannot be modified.' tracking=True
  • medium_id Many2one
    ondelete='set null'
  • name Char
    copy=False default=<expr> index='trigram' readonly=False required=True string='Order Reference'
  • note Html
    compute='_compute_note' precompute=True readonly=False store=True string='Terms and conditions'
  • order_line One2many → sale.order.line
    bypass_search_access=True comodel_name='sale.order.line' copy=True inverse_name='order_id' string='Order Lines'
  • origin Char
    help='Reference of the document that generated this sales order request' string='Source Document'
  • partner_credit_warning Text
    compute='_compute_partner_credit_warning'
  • partner_id Many2one → res.partner
    change_default=True check_company=True comodel_name='res.partner' index=True required=True string='Customer' tracking=1
  • partner_invoice_id Many2one → res.partner
    check_company=True comodel_name='res.partner' compute='_compute_partner_invoice_id' index='btree_not_null' precompute=True readonly=False required=True store=True string='Invoice Address'
  • partner_shipping_id Many2one → res.partner
    check_company=True comodel_name='res.partner' compute='_compute_partner_shipping_id' index='btree_not_null' precompute=True readonly=False required=True store=True string='Delivery Address'
  • payment_term_id Many2one → account.payment.term
    check_company=True comodel_name='account.payment.term' compute='_compute_payment_term_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" precompute=True readonly=False store=True string='Payment Terms'
  • pending_email_template_id Many2one → mail.template
    comodel_name='mail.template' ondelete='set null' readonly=True string='Pending Email Template'
  • preferred_payment_method_line_id Many2one → account.payment.method.line
    check_company=True comodel_name='account.payment.method.line' compute='_compute_preferred_payment_method_line_id' domain="[('payment_type', '=', 'inbound'), ('company_id', '=', company_id)]" precompute=True readonly=False store=True string='Payment Method'
  • prepayment_percent Float
    compute='_compute_prepayment_percent' help='The percentage of the amount needed that must be paid by the customer to confirm the order.' precompute=True readonly=False store=True string='Prepayment percentage'
  • pricelist_id Many2one → product.pricelist
    check_company=True comodel_name='product.pricelist' compute='_compute_pricelist_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='If you change the pricelist, only newly added lines will be affected.' precompute=True readonly=False store=True string='Pricelist' tracking=1
  • reference Char
    copy=False help='The payment communication of this sale order.' string='Payment Ref.'
  • require_payment Boolean
    compute='_compute_require_payment' help='Request a online payment from the customer to confirm the order.' precompute=True readonly=False store=True string='Online payment'
  • require_signature Boolean
    compute='_compute_require_signature' help='Request a online signature from the customer to confirm the order.' precompute=True readonly=False store=True string='Online signature'
  • sale_warning_text Text
    compute='_compute_sale_warning_text' help='Internal warning for the partner or the products as set by the user.' args: 'Sale Warning'
  • show_update_fpos Boolean
    store=False string='Has Fiscal Position Changed'
  • show_update_pricelist Boolean
    store=False string='Has Pricelist Changed'
  • signature Image
    attachment=True copy=False max_height=1024 max_width=1024 string='Signature'
  • signed_by Char
    copy=False string='Signed By'
  • signed_on Datetime
    copy=False string='Signed On'
  • source_id Many2one
    ondelete='set null'
  • state Selection
    copy=False default='draft' group_expand=True index=True readonly=True selection=SALE_ORDER_STATE string='Status' tracking=3
  • tag_ids Many2many → crm.tag
    column1='order_id' column2='tag_id' comodel_name='crm.tag' groups='sales_team.group_sale_salesman' relation='sale_order_tag_rel' string='Tags'
  • tax_calculation_rounding_method Selection
    depends=['company_id'] related='company_id.tax_calculation_rounding_method'
  • tax_country_id Many2one → res.country
    comodel_name='res.country' compute='_compute_tax_country_id' compute_sudo=True
  • tax_totals Binary
    compute='_compute_tax_totals' exportable=False
  • team_id Many2one → crm.team
    change_default=True check_company=True comodel_name='crm.team' compute='_compute_team_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" index=True ondelete='set null' precompute=True readonly=False store=True string='Sales Team' tracking=True
  • terms_type Selection
    related='company_id.terms_type'
  • transaction_ids Many2many → payment.transaction
    column1='sale_order_id' column2='transaction_id' comodel_name='payment.transaction' copy=False groups='account.group_account_invoice' readonly=True relation='sale_order_transaction_rel' string='Transactions'
  • type_name Char
    compute='_compute_type_name' string='Type Name'
  • user_id Many2one → res.users
    comodel_name='res.users' compute='_compute_user_id' domain=<expr> index=True precompute=True readonly=False store=True string='Salesperson' tracking=2
  • validity_date Date
    compute='_compute_validity_date' copy=False help='Validity of the order, after that you will not able to sign & pay the quotation.' precompute=True readonly=False store=True string='Expiration'
Public methods (24)
  • action_cancel(self)
    Cancel sales order and related draft invoices.
  • action_confirm(self)
    Confirm the given quotation(s) and set their confirmation date. If the corresponding setting is enabled, also locks the Sale Order. :return: True :rtype: bool :raise: UserError if trying to confirm cancelled SO's
  • action_draft(self)
  • action_lock(self)
  • action_open_business_doc(self)
    @api.readonly
  • action_open_discount_wizard(self)
    @api.readonly
  • action_preview_sale_order(self)
    @api.readonly
  • action_quotation_send(self)
    Opens a wizard to compose an email, with relevant mail template loaded by default
  • action_quotation_sent(self)
    Mark the given draft quotation(s) as sent. :raise: UserError if any given SO is not in draft state.
  • action_unlock(self)
  • action_update_prices(self)
  • action_update_taxes(self)
  • action_view_invoice(self, invoices=False)
    @api.readonly
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • create_document_from_attachment(self, attachment_ids)
    Create the sale orders from given attachment_ids and redirect newly create order view. :param list attachment_ids: List of attachments process. :return: An action redirecting to related sale order view. :rtype: dict
  • get_empty_list_help(self, help_message)
    @api.model
  • get_import_templates(self)
    @api.model
  • get_portal_last_transaction(self)
  • message_post(self, **kwargs)
  • onchange(self, values, field_names, fields_spec)
  • payment_action_capture(self)
    Capture all transactions linked to this sale order.
  • payment_action_void(self)
    Void all transactions linked to this sale order.
  • write(self, vals)

New fields (6)
  • company_id Many2one
    related='sale_order_id.company_id'
  • currency_id Many2one
    related='sale_order_id.currency_id'
  • discount_amount Monetary
    string='Amount'
  • discount_percentage Float
    string='Percentage'
  • discount_type Selection
    default='sol_discount' selection=[('sol_discount', 'On All Order Lines'), ('so_discount', 'Global Discount'), ('amount', 'Fixed Amount')]
  • sale_order_id Many2one → sale.order
    default=<expr> required=True args: 'sale.order'
Public methods (1)
  • action_apply_discount(self)

New fields (67)
  • allowed_uom_ids Many2many → uom.uom
    compute='_compute_allowed_uom_ids' args: 'uom.uom'
  • amount_invoiced Monetary
    compute='_compute_amount_invoiced' compute_sudo=True string='Invoiced Amount'
  • amount_to_invoice Monetary
    compute='_compute_amount_to_invoice' compute_sudo=True string='Un-invoiced Balance'
  • amount_to_invoice_at_date Float
    compute='_compute_amount_to_invoice_at_date' string='Amount'
  • analytic_line_ids One2many → account.analytic.line
    comodel_name='account.analytic.line' inverse_name='so_line' string='Analytic lines'
  • categ_id Many2one
    related='product_id.categ_id'
  • collapse_composition Boolean
    copy=True default=False string='Collapse Composition'
  • collapse_prices Boolean
    copy=True default=False string='Collapse Prices'
  • combo_item_id Many2one → product.combo.item
    comodel_name='product.combo.item'
  • company_id Many2one
    index=True precompute=True related='order_id.company_id' store=True
  • company_price_include Selection
    related='company_id.account_price_include'
  • currency_id Many2one
    depends=['order_id.currency_id'] precompute=True related='order_id.currency_id' store=True
  • customer_lead Float
    compute='_compute_customer_lead' help='Number of days between the order confirmation and the shipping of the products to the customer' precompute=True readonly=False required=True store=True string='Lead Time'
  • discount Float
    compute='_compute_discount' digits='Discount' precompute=True readonly=False store=True string='Discount (%)'
  • display_type Selection
    default=False selection=[('line_section', 'Section'), ('line_subsection', 'Subsection'), ('line_note', 'Note')]
  • extra_tax_data Json
  • invoice_lines Many2many → account.move.line
    column1='order_line_id' column2='invoice_line_id' comodel_name='account.move.line' copy=False relation='sale_order_line_invoice_rel' string='Invoice Lines'
  • invoice_status Selection
    compute='_compute_invoice_status' selection=[('upselling', 'Upselling Opportunity'), ('invoiced', 'Fully Invoiced'), ('to invoice', 'To Invoice'), ('no', 'Nothing to Invoice')] store=True string='Invoice Status'
  • is_configurable_product Boolean
    depends=['product_template_id'] related='product_template_id.has_configurable_attributes' string='Is the product configurable?'
  • is_downpayment Boolean
    help='Down payments are made when creating invoices from a sales order. They are not copied when duplicating a sales order.' string='Is a down payment'
  • is_expense Boolean
    help='Is true if the sales order line comes from an expense or a vendor bills' string='Is expense'
  • is_product_archived Boolean
    compute='_compute_is_product_archived'
  • linked_line_id Many2one → sale.order.line
    comodel_name='sale.order.line' copy=False domain="[('order_id', '=', order_id)]" index=True ondelete='cascade' string='Linked Order Line'
  • linked_line_ids One2many → sale.order.line
    comodel_name='sale.order.line' inverse_name='linked_line_id' string='Linked Order Lines'
  • linked_virtual_id Char
  • name Text
    compute='_compute_name' precompute=True readonly=False required=True store=True string='Description'
  • order_id Many2one → sale.order
    comodel_name='sale.order' copy=False index=True ondelete='cascade' required=True string='Order Reference'
  • order_partner_id Many2one
    index=True precompute=True related='order_id.partner_id' store=True string='Customer'
  • parent_id Many2one → sale.order.line
    comodel_name='sale.order.line' compute='_compute_parent_id' string='Parent Section Line'
  • price_reduce_taxexcl Monetary
    compute='_compute_price_reduce_taxexcl' precompute=True store=True string='Price Reduce Tax excl'
  • price_reduce_taxinc Monetary
    compute='_compute_price_reduce_taxinc' precompute=True store=True string='Price Reduce Tax incl'
  • price_subtotal Monetary
    compute='_compute_amount' precompute=True store=True string='Subtotal'
  • price_tax Float
    compute='_compute_amount' precompute=True store=True string='Total Tax'
  • price_total Monetary
    compute='_compute_amount' precompute=True store=True string='Total'
  • price_unit Float
    compute='_compute_price_unit' min_display_digits='Product Price' precompute=True readonly=False required=True store=True string='Unit Price'
  • pricelist_item_id Many2one → product.pricelist.item
    comodel_name='product.pricelist.item' compute='_compute_pricelist_item_id'
  • product_custom_attribute_value_ids One2many → product.attribute.custom.value
    comodel_name='product.attribute.custom.value' compute='_compute_custom_attribute_values' copy=True inverse_name='sale_order_line_id' precompute=True readonly=False store=True string='Custom Values'
  • product_id Many2one → product.product
    change_default=True check_company=True comodel_name='product.product' domain=<expr> index='btree_not_null' ondelete='restrict' string='Product'
  • product_no_variant_attribute_value_ids Many2many → product.template.attribute.value
    comodel_name='product.template.attribute.value' compute='_compute_no_variant_attribute_values' ondelete='restrict' precompute=True readonly=False store=True string='Extra Values'
  • product_template_attribute_value_ids Many2many
    depends=['product_id'] related='product_id.product_template_attribute_value_ids'
  • product_template_id Many2one → product.template
    comodel_name='product.template' compute='_compute_product_template_id' domain=<expr> readonly=False search='_search_product_template_id' string='Product Template'
  • product_type Selection
    depends=['product_id'] related='product_id.type'
  • product_uom_id Many2one → uom.uom
    comodel_name='uom.uom' compute='_compute_product_uom_id' domain='[("id", "in", allowed_uom_ids)]' ondelete='restrict' precompute=True readonly=False store=True string='Unit'
  • product_uom_qty Float
    compute='_compute_product_uom_qty' default=1.0 digits='Product Unit' precompute=True readonly=False required=True store=True string='Quantity'
  • product_uom_readonly Boolean
    compute='_compute_product_uom_readonly'
  • product_updatable Boolean
    compute='_compute_product_updatable' string='Can Edit Product'
  • qty_delivered Float
    compute='_compute_qty_delivered' copy=False default=0.0 digits='Product Unit' readonly=False store=True string='Delivery Quantity'
  • qty_delivered_at_date Float
    compute='_compute_qty_delivered_at_date' digits='Product Unit' string='Delivered'
  • qty_delivered_method Selection
    compute='_compute_qty_delivered_method' help='According to product configuration, the delivered quantity can be automatically computed by mechanism:\n - Manual: the quantity is set manually on the line\n - Analytic From expenses: the quantity is the quantity sum from posted expenses\n - Timesheet: the quantity is the sum of hours recorded on tasks linked to this sale line\n - Stock Moves: the quantity comes from confirmed pickings\n' precompute=True selection=[('manual', 'Manual'), ('analytic', 'Analytic From Expenses')] store=True string='Method to update delivered qty'
  • qty_invoiced Float
    compute='_compute_qty_invoiced' digits='Product Unit' store=True string='Invoiced Quantity'
  • qty_invoiced_at_date Float
    compute='_compute_qty_invoiced_at_date' digits='Product Unit' string='Invoiced'
  • qty_invoiced_posted Float
    compute='_compute_qty_invoiced_posted' digits='Product Unit' string='Invoiced Quantity (posted)'
  • qty_to_invoice Float
    compute='_compute_qty_to_invoice' digits='Product Unit' store=True string='Quantity To Invoice'
  • sale_line_warn_msg Text
    compute='_compute_sale_line_warn_msg'
  • salesman_id Many2one
    precompute=True related='order_id.user_id' store=True string='Salesperson'
  • selected_combo_items Char
    store=False
  • sequence Integer
    default=10 string='Sequence'
  • service_tracking Selection
    depends=['product_id'] related='product_id.service_tracking'
  • state Selection
    copy=False precompute=True related='order_id.state' store=True string='Order Status'
  • tax_calculation_rounding_method Selection
    readonly=True related='company_id.tax_calculation_rounding_method' string='Tax calculation rounding method'
  • tax_country_id Many2one
    related='order_id.tax_country_id'
  • tax_ids Many2many → account.tax
    check_company=True comodel_name='account.tax' compute='_compute_tax_ids' context={'active_test': False, 'hide_original_tax_ids': True} domain="[('type_tax_use', '=', 'sale'), ('country_id', '=', tax_country_id)]" precompute=True readonly=False store=True string='Taxes'
  • technical_price_unit Float
  • translated_product_name Text
    compute='_compute_translated_product_name'
  • untaxed_amount_invoiced Monetary
    compute='_compute_untaxed_amount_invoiced' store=True string='Untaxed Invoiced Amount'
  • untaxed_amount_to_invoice Monetary
    compute='_compute_untaxed_amount_to_invoice' store=True string='Untaxed Amount To Invoice'
  • virtual_id Char
Public methods (6)
  • action_add_from_catalog(self)
    @api.readonly
  • compute_uom_qty(self, new_qty, stock_move, rounding=True)
  • create(self, vals_list)
    @api.model_create_multi
  • get_parent_section_line(self)
  • has_valued_move_ids(self)
  • write(self, vals)

New fields (39)
  • campaign_id Many2one → utm.campaign
    comodel_name='utm.campaign' readonly=True string='Campaign'
  • categ_id Many2one → product.category
    comodel_name='product.category' readonly=True string='Product Category'
  • commercial_partner_id Many2one → res.partner
    comodel_name='res.partner' readonly=True string='Customer Entity'
  • company_id Many2one → res.company
    comodel_name='res.company' readonly=True
  • country_id Many2one → res.country
    comodel_name='res.country' readonly=True string='Customer Country'
  • currency_id Many2one → res.currency
    comodel_name='res.currency' readonly=True
  • date Datetime
    readonly=True string='Order Date'
  • discount Float
    aggregator='avg' readonly=True string='Discount %'
  • discount_amount Monetary
    readonly=True string='Discount Amount'
  • industry_id Many2one → res.partner.industry
    comodel_name='res.partner.industry' readonly=True string='Customer Industry'
  • invoice_status Selection
    readonly=True selection=[('upselling', 'Upselling Opportunity'), ('invoiced', 'Fully Invoiced'), ('to invoice', 'To Invoice'), ('no', 'Nothing to Invoice')] string='Order Invoice Status'
  • line_invoice_status Selection
    readonly=True selection=[('upselling', 'Upselling Opportunity'), ('invoiced', 'Fully Invoiced'), ('to invoice', 'To Invoice'), ('no', 'Nothing to Invoice')] string='Invoice Status'
  • medium_id Many2one → utm.medium
    comodel_name='utm.medium' readonly=True string='Medium'
  • name Char
    readonly=True string='Order Reference'
  • nbr Integer
    readonly=True string='# of Lines'
  • order_reference Reference
    aggregator='count_distinct' selection=[('sale.order', 'Sales Order')] string='Order'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' readonly=True string='Customer'
  • partner_zip Char
    readonly=True string='Customer ZIP'
  • price_subtotal Monetary
    readonly=True string='Untaxed Total'
  • price_total Monetary
    readonly=True string='Total'
  • price_unit Float
    aggregator='avg' readonly=True string='Unit Price'
  • pricelist_id Many2one → product.pricelist
    comodel_name='product.pricelist' readonly=True
  • product_id Many2one → product.product
    comodel_name='product.product' readonly=True string='Product Variant'
  • product_tmpl_id Many2one → product.template
    comodel_name='product.template' readonly=True string='Product'
  • product_uom_id Many2one → uom.uom
    comodel_name='uom.uom' readonly=True string='Unit'
  • product_uom_qty Float
    readonly=True string='Qty Ordered'
  • qty_delivered Float
    readonly=True string='Qty Delivered'
  • qty_invoiced Float
    readonly=True string='Qty Invoiced'
  • qty_to_deliver Float
    readonly=True string='Qty To Deliver'
  • qty_to_invoice Float
    readonly=True string='Qty To Invoice'
  • source_id Many2one → utm.source
    comodel_name='utm.source' readonly=True string='Source'
  • state Selection
    readonly=True selection=SALE_ORDER_STATE string='Status'
  • state_id Many2one → res.country.state
    comodel_name='res.country.state' readonly=True string='Customer State'
  • team_id Many2one → crm.team
    comodel_name='crm.team' readonly=True string='Sales Team'
  • untaxed_amount_invoiced Monetary
    readonly=True string='Untaxed Amount Invoiced'
  • untaxed_amount_to_invoice Monetary
    readonly=True string='Untaxed Amount To Invoice'
  • user_id Many2one → res.users
    comodel_name='res.users' readonly=True string='Salesperson'
  • volume Float
    readonly=True string='Volume'
  • weight Float
    readonly=True string='Gross Weight'
Public methods (1)
  • action_open_order(self)
    @api.readonly

New fields (4)
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    related='company_id.currency_id' string='Currency' args: 'res.currency'
  • invoiced_amount Integer
    compute='_compute_sale_invoiced_amount' compute_sudo=True groups='sales_team.group_sale_salesman' string='Revenues generated by the campaign'
  • quotation_count Integer
    compute='_compute_quotation_count' compute_sudo=True groups='sales_team.group_sale_salesman' args: 'Quotation Count'
Public methods (2)
  • action_redirect_to_invoiced(self)
  • action_redirect_to_quotations(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/18.0/sale
VERSION
VERSION 1.2
CATEGORY
CATEGORYSales/Sales
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Josse Colpaert, Xavier ALT, Christophe Simonis, Xavier Morel, Joren Van Onder, qdp-odoo, Géry Debongnie, Aaron Bohy, Jeremy Kersten, GitHub, Damien Bouvy, Yannick Tivisse, Odoo Online, Pierre Masereel, Laurent Smet, Christophe Monniez, Jorge Pinna Puissant, Alexandre Kühn, Arnold Moyaux, Xavier-Do, Victor Feyens, Andrea Grazioso (agr-odoo), Adrien Dieudonné, Paul Morelle, William Henrotin, Sébastien Theys, Akim Juillerat, oco-odoo, Julien Mougenot, Anh Thao Pham (pta), svs-odoo, Achraf (abz), Brice bib Bartoletti, Prakash Prajapati, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, Arnaud Joset, odoo, roen-odoo, william-andre, Víctor Martínez, Florian Damhaut, John Laterre (jol), Ruben Gomes, Thomas Beckers, Antoine Vandevenne (anv), Demesmaeker, Aurelien van Delft (avd), Achraf, Valentin Chevalier, Julien Banken, Vincent Larcin, Pierrot (prro), jbw-odoo, Iván Todorovich, Habib (ayh), damr, David Monnom (moda), alsh-odoo, Gaetan Vanden Bergh (gavb), Louis Wicket (wil), Mylyna Hy, Maximilien (malb), Victor Piryns (pivi), Thomas Becquevort (thbe), Gauthier Wala (gawa), Pierre-Yves Dufays, Pieter Claeys (clpi), Claire Bretton (clbr), Yosua Nicolaus, Levi Siuzdak (sile), Antoine Dupuis (andu), Michael Tietz, Dylan Kiss (dyki), Julien Alardot (jual), Valeriya(vchu), Chong Wang (cwg), Adrien Schoffeniels, Martin Maes, tanghulu0608, Anita (anko), Xavier Bol (xbo), Brieuc-brd, SilvioC2C, AH-Yussef, sovi-odoo, Harsh Modi, Sarah Bellefroid, Arnaud Sibille, Mahdi Cheikh Rouhou (macr), ilru-odoo, Noe Antoine, omra-odoo, Nicolas Viseur (vin), Walid (wasa), sesn-odoo, guva-odoo, kdeb@odoo.com, Paul Stroobant, stefanorigano (SRI), Astik Singh, Mattis Megevand, Youssef Bashandy, Ethan Vincent, Mathieu (mcou), lase@odoo.com, bary, Maryam Kia, Louis (loti), jorv-odoo, Maxime de Neuville, Sven Fuehr, AMZIL Ayoub, yosa-odoo, Mohamed GadAlrab, Nathaniel (naja), vava-odoo, Bastien Fafchamps (bafa), Julien Carion (juca), kcv-odoo, odoostan, Tanguy Quéguineur, dere-odoo, Lina (liew), Chrysanthe (chgo), sami odoo, Louis (wil), Junqi Wu, mano-odoo, aamo-odoo, Shaan Thakkar (THSH), Mathieu Coutant, mathysPaul, Patricia Daloze (pda), Sanchit Gupta, Ryan Cen, casp-odoo, Manushi Shah, Pierre Pulinckx (PIPU), dija-odoo, AhmedElemary57, Ricardo Gomes Rodrigues, Trinh Ngoc Hung, Maira Salazar (srma), st-yes, David Van Droogenbroeck (DROD), khsr-odoo, Florian Mounier, Pierre Lamotte (pila), nikj-odoo, Pierre Pulinckx (pipu), Pierre Pulinckx, Bastien PIERRE, Anton Romanova (roan), jeep-odoo, Corentin Heinix (cohe), Corentin Lombard, kpt-odoo, Shrey Mehta, kusi-odoo, Bastien (bvdn), Christihan Laurel [Vauxoo], plha-odoo, lse-odoo, Krzysztof Magusiak (krma), Mahdi Alijani (malj), rupa-odoo, Ajit Singh, Armin-FalDiS, Franco Leyes, krip-odoo, Basioni (basm), utma-odoo, Robin Engels (roen), Maeva De Keyser (MDEK), Tyler Landivar (tylan), Rushil Patel, desh, bhra-odoo, defl, bhna-odoo, aksi-odoo, sbel-odoo, Laurent Smet (LAS), Killian Frappart, suju-odoo, path-odoo, Nisarg (nipl), assh-odoo, livaios, Mitul shah(mish-odoo), Lionel Piraux (lipi), Eduardo Villalpando Mello, Leila Kerroum Balaguer, Merlin Guillaume, shrm-odoo, YoussefM890, saurabh, Julien Hémono, jand-odoo
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:25:56
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - 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
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module contains all the common features of Sales Management and eCommerce.
    

Code Analysis

Views touched (73)
XML IDNameModelTypeStatus
account_invoice_form Account Invoice account.move xpath Inherits account.view_move_form
account_invoice_groupby_inherit account.move.groupby account.move field Inherits account.view_account_invoice_filter
account_invoice_report_view_tree account.invoice.report.view.list.inherit.sale account.invoice.report field Inherits account.account_invoice_report_view_tree
account_invoice_view_tree account.move.list.inherit.sale account.move field Inherits account.view_invoice_tree
crm_lead_partner_kanban_view res.partner.kanban.saleorder.inherit res.partner xpath Inherits base.res_partner_kanban_view
crm_team_salesteams_view_form crm.team.form crm.team field Inherits sales_team.crm_team_view_form
crm_team_view_kanban_dashboard crm.team.view.kanban.dashboard.inherit.sale crm.team xpath Inherits sales_team.crm_team_view_kanban_dashboard
document_tax_totals document_tax_totals ir.ui.view qweb Inherits account.document_tax_totals_template
mass_cancel_orders_view_form sale.mass.cancel.orders.form sale.mass.cancel.orders form New
payment_link_wizard_view_form payment.link.wizard.form payment.link.wizard field Inherits payment.payment_link_wizard_view_form
payment_provider_form payment.provider.form.inherit.sale payment.provider group Inherits payment.payment_provider_form
portal_my_home_menu_sale Portal layout : sales menu entries ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home_sale Quotations / Sales Orders ir.ui.view qweb Inherits portal.portal_my_home
portal_my_orders My Sales Orders ir.ui.view qweb New
portal_my_quotations My Quotations ir.ui.view qweb New
product_document_form product.document.form.sale product.document sheet Inherits product.product_document_form
product_document_kanban product.document.kanban.sale product.document xpath Inherits product.product_document_kanban
product_document_list product.document.list.sale product.document field Inherits product.product_document_list
product_document_search product.document.search.sale product.document search Inherits product.product_document_search
product_form_view_sale_order_button product.product.sale.order product.product div Inherits product.product_normal_form_view
product_packaging_form_view_sale product.packaging.form.view.sale product.packaging group Inherits product.product_packaging_form_view
product_packaging_tree_view_sale product.packaging.list.view.sale product.packaging field Inherits product.product_packaging_tree_view
product_template_form_view product.template.form.view.inherit.sale product.template page Inherits product.product_template_form_view
product_template_form_view_sale_order_button product.template.sale.order.button product.template button Inherits product.product_template_only_form_view
product_template_view_form product.template.form.inherit.sale.product.configurator product.template group Inherits product.product_template_form_view
product_view_kanban_catalog product.view.kanban.catalog.inherit.sale product.product xpath Inherits product.product_view_kanban_catalog
product_view_search_catalog product.view.search.catalog.inherit.sale product.product filter Inherits product.product_view_search_catalog
quote_document_layout_preview quote_document_layout_preview ir.ui.view qweb New
report_saleorder report_saleorder ir.ui.view qweb New
report_saleorder_document report_saleorder_document ir.ui.view qweb New
report_saleorder_pro_forma report_saleorder_pro_forma ir.ui.view qweb New
report_saleorder_raw report_saleorder_raw ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.sale res.config.settings xpath Inherits base.res_config_settings_view_form
res_partner_view_buttons res.partner.view.buttons res.partner div Inherits base.view_partner_form
res_partner_view_form_payment_defaultcreditcard res.partner.view.form.payment.defaultcreditcard res.partner button Inherits payment.view_partners_form_payment_defaultcreditcard
res_partner_view_form_property_inherit res.partner.view.form.property.inherit res.partner group Inherits account.view_partner_property_form
sale_order_cancel_view_form sale.order.cancel.form sale.order.cancel form New
sale_order_kanban_upload sale.order.kanban.upload (orders) sale.order kanban Inherits view_sale_order_kanban
sale_order_line_view_form_readonly sale.order.line.form.readonly sale.order.line form New
sale_order_line_view_kanban sale.order.line.kanban sale.order.line kanban New
sale_order_line_wizard_form sale.order.line.wizard.form sale.order.discount form New
sale_order_list_upload sale.order.tree.upload (orders) sale.order list Inherits view_order_tree
sale_order_portal_content Sales Order Portal Content ir.ui.view qweb New
sale_order_portal_content_totals_table sale_order_portal_content_totals_table ir.ui.view qweb New
sale_order_portal_template Sales Order ir.ui.view qweb Inherits portal.portal_sidebar
sale_order_tree sale.order.list sale.order list New
sale_order_view_activity sale.order.activity sale.order activity New
sale_order_view_search_inherit_quotation sale.order.search.inherit.quotation sale.order filter Inherits sale.view_sales_order_filter
sale_order_view_search_inherit_sale sale.order.search.inherit.sale sale.order filter Inherits sale.view_sales_order_filter
sale_report_graph_bar sale.report.graph.bar sale.report graph Inherits view_order_product_graph
sale_report_graph_pie sale.report.graph.pie sale.report graph Inherits view_order_product_graph
sale_report_view_tree sale.report.view.list sale.report list New
transaction_form_inherit_sale payment.transaction.form.inherit.sale.payment payment.transaction xpath Inherits payment.payment_transaction_form
utm_campaign_view_form utm.campaign.view.form utm.campaign xpath Inherits utm.utm_campaign_view_form
utm_campaign_view_kanban utm.campaign.view.kanban utm.campaign xpath Inherits utm.utm_campaign_view_kanban
view_account_invoice_report_search_inherit account.invoice.report.search.inherit account.invoice.report filter Inherits account.view_account_invoice_report_search
view_category_property_form product.category.property.form.inherit.sale product.category field Inherits product.product_category_form_view
view_order_form sale.order.form sale.order form New
view_order_line_tree sale.order.line.list sale.order.line list New
view_order_product_graph sale.report.graph sale.report graph New
view_order_product_pivot sale.report.pivot sale.report pivot New
view_order_product_search sale.report.search sale.report search New
view_order_tree sale.order.list (orders) sale.order list Inherits sale_order_tree
view_quotation_kanban_with_onboarding sale.order.kanban sale.order xpath Inherits view_sale_order_kanban
view_quotation_tree sale.order.list (quotes) sale.order list Inherits sale_order_tree
view_quotation_tree_with_onboarding sale.order.list sale.order xpath Inherits view_quotation_tree
view_sale_advance_payment_inv Invoice Orders sale.advance.payment.inv form New
view_sale_order_calendar sale.order.calendar sale.order calendar New
view_sale_order_graph sale.order.graph sale.order graph New
view_sale_order_kanban sale.order.kanban sale.order kanban New
view_sale_order_pivot sale.order.pivot sale.order pivot New
view_sales_order_filter sale.order.list.select sale.order search New
view_sales_order_line_filter sale.order.line.select sale.order.line search New
Models touched (32)

New fields (1)
  • business_domain Selection
    ondelete={'sale_order': 'cascade'} selection_add=[('sale_order', 'Sale Order')]
Public methods (0)

No public methods.

New fields (1)
  • so_line Many2one → sale.order.line
    domain=[('qty_delivered_method', '=', 'analytic')] index='btree_not_null' string='Sales Order Item' args: 'sale.order.line'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • team_id Many2one → crm.team
    comodel_name='crm.team' string='Sales Team'
Public methods (0)

No public methods.

New fields (5)
  • campaign_id Many2one
    ondelete='set null'
  • medium_id Many2one
    ondelete='set null'
  • sale_order_count Integer
    compute='_compute_origin_so_count' string='Sale Order Count'
  • source_id Many2one
    ondelete='set null'
  • team_id Many2one → crm.team
    compute='_compute_team_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" ondelete='set null' readonly=False store=True string='Sales Team' tracking=True args: 'crm.team'
Public methods (5)
  • action_post(self)
  • action_view_source_sale_orders(self)
  • button_cancel(self)
  • button_draft(self)
  • unlink(self)

New fields (2)
  • is_downpayment Boolean
  • sale_line_ids Many2many → sale.order.line
    copy=False readonly=True string='Sales Order Lines' args: 'sale.order.line', 'sale_order_line_invoice_rel', 'invoice_line_id', 'order_line_id'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (6)
  • invoiced Float
    compute='_compute_invoiced' help='Invoice revenue for the current month. This is the amount the sales channel has invoiced this month. It is used to compute the progression ratio of the current and target revenue on the kanban view.' readonly=True string='Invoiced This Month'
  • invoiced_target Float
    help='Revenue Target for the current month (untaxed total of paid invoices).' string='Invoicing Target'
  • quotations_amount Float
    compute='_compute_quotations_to_invoice' readonly=True string='Amount of quotations to invoice'
  • quotations_count Integer
    compute='_compute_quotations_to_invoice' readonly=True string='Number of quotations to invoice'
  • sale_order_count Integer
    compute='_compute_sale_order_count' string='# Sale Orders'
  • sales_to_invoice_count Integer
    compute='_compute_sales_to_invoice' readonly=True string='Number of sales to invoice'
Public methods (2)
  • action_primary_channel_button(self)
  • update_invoiced_target(self, value)

New fields (0)

No new fields.

Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (1)
  • action_schedule_message(self, scheduled_date=False)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • amount_paid Monetary
    readonly=True string='Already Paid'
  • confirmation_message Char
    compute='_compute_confirmation_message'
Public methods (0)

No public methods.

New fields (1)
  • so_reference_type Selection
    default='so_name' help='You can set here the communication type that will appear on sales orders.The communication will be given to the customer when they choose the payment method.' selection=[('so_name', 'Based on Document Reference'), ('partner', 'Based on Customer ID')] string='Communication'
Public methods (0)

No public methods.

New fields (2)
  • sale_order_ids Many2many → sale.order
    copy=False readonly=True string='Sales Orders' args: 'sale.order', 'sale_order_transaction_rel', 'transaction_id', 'sale_order_id'
  • sale_order_ids_nbr Integer
    compute='_compute_sale_order_ids_nbr' string='# of Sales Orders'
Public methods (1)
  • action_view_sales_orders(self)

New fields (1)
  • sale_order_line_id Many2one → sale.order.line
    ondelete='cascade' string='Sales Order Line' args: 'sale.order.line'
Public methods (0)

No public methods.

New fields (1)
  • property_account_downpayment_categ_id Many2one → account.account
    comodel_name='account.account' company_dependent=True domain=[('deprecated', '=', False), ('account_type', 'not in', ('asset_receivable', 'liability_payable', 'asset_cash', 'liability_credit_card', 'off_balance'))] help='This account will be used on Downpayment invoices.' string='Downpayment Account' tracking=True
Public methods (0)

No public methods.

New fields (1)
  • attached_on_sale Selection
    default='hidden' groups='sales_team.group_sale_salesman' help='Allows you to share the document with your customers within a sale.\nOn quote: the document will be sent to and accessible by customers at any time.\ne.g. this option can be useful to share Product description files.\nOn order confirmation: the document will be sent to and accessible by customers.\ne.g. this option can be useful to share User Manual or digital content bought on ecommerce. ' required=True selection=[('hidden', 'Hidden'), ('quotation', 'On quote'), ('sale_order', 'On confirmed order')] string='Sale : Visible at'
Public methods (0)

No public methods.

New fields (1)
  • sales Boolean
    default=True help='If true, the packaging can be used for sales orders' args: 'Sales'
Public methods (0)

No public methods.

New fields (2)
  • product_catalog_product_is_in_sale_order Boolean
    compute='_compute_product_is_in_sale_order' search='_search_product_is_in_sale_order'
  • sales_count Float
    compute='_compute_sales_count' digits='Product Unit of Measure' string='Sold'
Public methods (1)
  • action_view_sales(self)

New fields (8)
  • expense_policy Selection
    compute='_compute_expense_policy' default='no' help='Validated expenses, vendor bills, or stock pickings (set up to track costs) can be invoiced to the customer at either cost or sales price.' readonly=False selection=[('no', 'No'), ('cost', 'At cost'), ('sales_price', 'Sales price')] store=True string='Re-Invoice Costs'
  • invoice_policy Selection
    compute='_compute_invoice_policy' help='Ordered Quantity: Invoice quantities ordered by the customer.\nDelivered Quantity: Invoice quantities delivered to the customer.' precompute=True readonly=False selection=[('order', 'Ordered quantities'), ('delivery', 'Delivered quantities')] store=True string='Invoicing Policy' tracking=True
  • optional_product_ids Many2many → product.template
    check_company=True column1='src_id' column2='dest_id' comodel_name='product.template' help='Optional Products are suggested whenever the customer hits *Add to Cart* (cross-sell strategy, e.g. for computers: warranty, software, etc.).' relation='product_optional_rel' string='Optional Products'
  • sale_line_warn Selection
    default='no-message' help=WARNING_HELP required=True string='Sales Order Line' args: WARNING_MESSAGE
  • sale_line_warn_msg Text
    string='Message for Sales Order Line'
  • sales_count Float
    compute='_compute_sales_count' digits='Product Unit of Measure' string='Sold'
  • service_type Selection
    compute='_compute_service_type' help='Manually set quantities on order: Invoice based on the manually entered quantity, without creating an analytic account.\nTimesheets on contract: Invoice based on the tracked hours on the related timesheet.\nCreate a task and track hours: Create a task on the sales order validation and track the work hours.' precompute=True readonly=False selection=[('manual', 'Manually set quantities on order')] store=True string='Track Service'
  • visible_expense_policy Boolean
    compute='_compute_visible_expense_policy' string='Re-Invoice Policy visible'
Public methods (3)
  • action_view_sales(self)
  • get_import_templates(self)
    @api.model
  • get_single_product_variant(self)
    Method used by the product configurator to check if the product is configurable or not. We need to open the product configurator if the product: - is configurable (see has_configurable_attributes) - has optional products

New fields (6)
  • portal_confirmation_pay Boolean
    string='Online Payment'
  • portal_confirmation_sign Boolean
    default=True string='Online Signature'
  • prepayment_percent Float
    default=1.0 help='The percentage of the amount needed to be paid to confirm quotations.' string='Prepayment percentage'
  • quotation_validity_days Integer
    default=30 help='Days between quotation proposal and expiration. 0 days means automatic expiration is disabled' string='Default Quotation Validity'
  • sale_discount_product_id Many2one → product.product
    check_company=True comodel_name='product.product' domain=[('type', '=', 'service'), ('invoice_policy', '=', 'order')] help='Default product used for discounts' string='Discount Product'
  • sale_onboarding_payment_method Selection
    selection=[('digital_signature', 'Sign online'), ('paypal', 'PayPal'), ('stripe', 'Stripe'), ('other', 'Pay with another payment provider'), ('manual', 'Manual Payment')] string='Sale onboarding selected payment method'
Public methods (0)

No public methods.

New fields (28)
  • automatic_invoice Boolean
    config_parameter='sale.automatic_invoice' help='The invoice is generated automatically and available in the customer portal when the transaction is confirmed by the payment provider.\nThe invoice is marked as paid and the payment is registered in the payment journal defined in the configuration of the payment provider.\nThis mode is advised if you issue the final invoice at the order and not after the delivery.' string='Automatic Invoice'
  • default_invoice_policy Selection
    default='order' default_model='product.template' selection=[('order', 'Invoice what is ordered'), ('delivery', 'Invoice what is delivered')] string='Invoicing Policy'
  • group_auto_done_setting Boolean
    implied_group='sale.group_auto_done_setting' string='Lock Confirmed Sales'
  • group_discount_per_so_line Boolean
    implied_group='sale.group_discount_per_so_line' string='Discounts'
  • group_proforma_sales Boolean
    help='Allows you to send pro-forma invoice.' implied_group='sale.group_proforma_sales' string='Pro-Forma Invoice'
  • group_warning_sale Boolean
    implied_group='sale.group_warning_sale' string='Sale Order Warnings'
  • invoice_mail_template_id Many2one → mail.template
    comodel_name='mail.template' config_parameter='sale.default_invoice_email_template' domain=[('model', '=', 'account.move')] help='Email sent to the customer once the invoice is available.' string='Invoice Email Template'
  • module_delivery Boolean
    args: 'Delivery Methods'
  • module_delivery_bpost Boolean
    args: 'bpost Connector'
  • module_delivery_dhl Boolean
    args: 'DHL Express Connector'
  • module_delivery_easypost Boolean
    args: 'Easypost Connector'
  • module_delivery_fedex Boolean
    args: 'FedEx Connector'
  • module_delivery_sendcloud Boolean
    args: 'Sendcloud Connector'
  • module_delivery_shiprocket Boolean
    args: 'Shiprocket Connector'
  • module_delivery_starshipit Boolean
    args: 'Starshipit Connector'
  • module_delivery_ups Boolean
    args: 'UPS Connector'
  • module_delivery_usps Boolean
    args: 'USPS Connector'
  • module_product_email_template Boolean
    args: 'Specific Email'
  • module_sale_amazon Boolean
    args: 'Amazon Sync'
  • module_sale_commission Boolean
    args: 'Commissions'
  • module_sale_loyalty Boolean
    args: 'Coupons & Loyalty'
  • module_sale_margin Boolean
    args: 'Margins'
  • module_sale_pdf_quote_builder Boolean
    args: 'PDF Quote builder'
  • module_sale_product_matrix Boolean
    args: 'Sales Grid Entry'
  • portal_confirmation_pay Boolean
    readonly=False related='company_id.portal_confirmation_pay'
  • portal_confirmation_sign Boolean
    readonly=False related='company_id.portal_confirmation_sign'
  • prepayment_percent Float
    readonly=False related='company_id.prepayment_percent'
  • quotation_validity_days Integer
    readonly=False related='company_id.quotation_validity_days'
Public methods (1)
  • set_values(self)

New fields (4)
  • sale_order_count Integer
    compute='_compute_sale_order_count' groups='sales_team.group_sale_salesman' string='Sale Order Count'
  • sale_order_ids One2many → sale.order
    args: 'sale.order', 'partner_id', 'Sales Order'
  • sale_warn Selection
    default='no-message' help=WARNING_HELP args: WARNING_MESSAGE, 'Sales Warnings'
  • sale_warn_msg Text
    args: 'Message for Sales Order'
Public methods (2)
  • action_view_sale_order(self)
  • can_edit_vat(self)
    Can't edit `vat` if there is (non draft) issued SO.

New fields (14)
  • advance_payment_method Selection
    default='delivered' help='A standard invoice is issued with all the order lines ready for invoicing,according to their invoicing policy (based on ordered or delivered quantity).' required=True selection=[('delivered', 'Regular invoice'), ('percentage', 'Down payment (percentage)'), ('fixed', 'Down payment (fixed amount)')] string='Create Invoice'
  • amount Float
    help='The percentage of amount to be invoiced in advance.' string='Down Payment'
  • amount_invoiced Monetary
    compute='_compute_invoice_amounts' help='Only confirmed down payments are considered.' string='Already invoiced'
  • amount_to_invoice Monetary
    compute='_compute_invoice_amounts' help='The amount to invoice = Sale Order Total - Confirmed Down Payments.' string='Amount to invoice'
  • company_id Many2one → res.company
    comodel_name='res.company' compute='_compute_company_id' store=True
  • consolidated_billing Boolean
    default=True help='Create one invoice for all orders related to same customer and same invoicing address' string='Consolidated Billing'
  • count Integer
    compute='_compute_count' string='Order Count'
  • currency_id Many2one → res.currency
    comodel_name='res.currency' compute='_compute_currency_id' store=True
  • deduct_down_payments Boolean
    default=True string='Deduct down payments'
  • display_draft_invoice_warning Boolean
    compute='_compute_display_draft_invoice_warning'
  • display_invoice_amount_warning Boolean
    compute='_compute_display_invoice_amount_warning'
  • fixed_amount Monetary
    help='The fixed amount to be invoiced in advance.' string='Down Payment Amount (Fixed)'
  • has_down_payments Boolean
    compute='_compute_has_down_payments' string='Has down payments'
  • sale_order_ids Many2many → sale.order
    default=<expr> args: 'sale.order'
Public methods (2)
  • create_invoices(self)
  • view_draft_invoices(self)

New fields (3)
  • has_confirmed_order Boolean
    compute='_compute_has_confirmed_order'
  • sale_order_ids Many2many → sale.order
    comodel_name='sale.order' default=<expr> relation='sale_order_mass_cancel_wizard_rel' string='Sale orders to cancel'
  • sale_orders_count Integer
    compute='_compute_sale_orders_count'
Public methods (1)
  • action_mass_cancel(self)

New fields (61)
  • amount_invoiced Monetary
    compute='_compute_amount_invoiced' string='Already invoiced'
  • amount_paid Float
    compute='_compute_amount_paid' compute_sudo=True help="Sum of transactions made in through the online payment form that are in the state 'done' or 'authorized' and linked to this order." string='Payment Transactions Amount'
  • amount_tax Monetary
    compute='_compute_amounts' store=True string='Taxes'
  • amount_to_invoice Monetary
    compute='_compute_amount_to_invoice' string='Un-invoiced Balance'
  • amount_total Monetary
    compute='_compute_amounts' store=True string='Total' tracking=4
  • amount_undiscounted Float
    compute='_compute_amount_undiscounted' digits=0 string='Amount Before Discount'
  • amount_untaxed Monetary
    compute='_compute_amounts' store=True string='Untaxed Amount' tracking=5
  • authorized_transaction_ids Many2many → payment.transaction
    comodel_name='payment.transaction' compute='_compute_authorized_transaction_ids' compute_sudo=True copy=False string='Authorized Transactions'
  • campaign_id Many2one
    ondelete='set null'
  • client_order_ref Char
    copy=False string='Customer Reference'
  • commitment_date Datetime
    copy=False help='This is the delivery date promised to the customer. If set, the delivery order will be scheduled based on this date rather than product lead times.' string='Delivery Date'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> index=True required=True
  • company_price_include Selection
    related='company_id.account_price_include'
  • country_code Char
    related='company_id.account_fiscal_country_id.code' string='Country code'
  • create_date Datetime
    index=True readonly=True string='Creation Date'
  • currency_id Many2one → res.currency
    comodel_name='res.currency' compute='_compute_currency_id' ondelete='restrict' precompute=True store=True
  • currency_rate Float
    compute='_compute_currency_rate' digits=0 precompute=True store=True string='Currency Rate'
  • date_order Datetime
    copy=False default=fields.Datetime.now help='Creation date of draft/sent orders,\nConfirmation date of confirmed orders.' required=True string='Order Date'
  • duplicated_order_ids Many2many → sale.order
    comodel_name='sale.order' compute='_compute_duplicated_order_ids'
  • expected_date Datetime
    compute='_compute_expected_date' help='Delivery date you can promise to the customer, computed from the minimum lead time of the order lines.' store=False string='Expected Date'
  • fiscal_position_id Many2one → account.fiscal.position
    check_company=True comodel_name='account.fiscal.position' compute='_compute_fiscal_position_id' help='Fiscal positions are used to adapt taxes and accounts for particular customers or sales orders/invoices.The default value comes from the customer.' precompute=True readonly=False store=True string='Fiscal Position'
  • has_active_pricelist Boolean
    compute='_compute_has_active_pricelist'
  • has_archived_products Boolean
    compute='_compute_has_archived_products'
  • invoice_count Integer
    compute='_get_invoiced' string='Invoice Count'
  • invoice_ids Many2many → account.move
    comodel_name='account.move' compute='_get_invoiced' copy=False search='_search_invoice_ids' string='Invoices'
  • invoice_status Selection
    compute='_compute_invoice_status' selection=INVOICE_STATUS store=True string='Invoice Status'
  • is_expired Boolean
    compute='_compute_is_expired' string='Is Expired'
  • journal_id Many2one → account.journal
    check_company=True compute='_compute_journal_id' domain=[('type', '=', 'sale')] help='If set, the SO will invoice in this journal; otherwise the sales journal with the lowest sequence is used.' precompute=True readonly=False store=True string='Invoicing Journal' args: 'account.journal'
  • locked Boolean
    copy=False default=False help='Locked orders cannot be modified.' tracking=True
  • medium_id Many2one
    ondelete='set null'
  • name Char
    copy=False default=<expr> index='trigram' readonly=False required=True string='Order Reference'
  • note Html
    compute='_compute_note' precompute=True readonly=False store=True string='Terms and conditions'
  • order_line One2many → sale.order.line
    auto_join=True comodel_name='sale.order.line' copy=True inverse_name='order_id' string='Order Lines'
  • origin Char
    help='Reference of the document that generated this sales order request' string='Source Document'
  • partner_credit_warning Text
    compute='_compute_partner_credit_warning'
  • partner_id Many2one → res.partner
    change_default=True check_company=True comodel_name='res.partner' index=True required=True string='Customer' tracking=1
  • partner_invoice_id Many2one → res.partner
    check_company=True comodel_name='res.partner' compute='_compute_partner_invoice_id' index='btree_not_null' precompute=True readonly=False required=True store=True string='Invoice Address'
  • partner_shipping_id Many2one → res.partner
    check_company=True comodel_name='res.partner' compute='_compute_partner_shipping_id' index='btree_not_null' precompute=True readonly=False required=True store=True string='Delivery Address'
  • payment_term_id Many2one → account.payment.term
    check_company=True comodel_name='account.payment.term' compute='_compute_payment_term_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" precompute=True readonly=False store=True string='Payment Terms'
  • prepayment_percent Float
    compute='_compute_prepayment_percent' help='The percentage of the amount needed that must be paid by the customer to confirm the order.' precompute=True readonly=False store=True string='Prepayment percentage'
  • pricelist_id Many2one → product.pricelist
    check_company=True comodel_name='product.pricelist' compute='_compute_pricelist_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='If you change the pricelist, only newly added lines will be affected.' precompute=True readonly=False store=True string='Pricelist' tracking=1
  • reference Char
    copy=False help='The payment communication of this sale order.' string='Payment Ref.'
  • require_payment Boolean
    compute='_compute_require_payment' help='Request a online payment from the customer to confirm the order.' precompute=True readonly=False store=True string='Online payment'
  • require_signature Boolean
    compute='_compute_require_signature' help='Request a online signature from the customer to confirm the order.' precompute=True readonly=False store=True string='Online signature'
  • show_update_fpos Boolean
    store=False string='Has Fiscal Position Changed'
  • show_update_pricelist Boolean
    store=False string='Has Pricelist Changed'
  • signature Image
    attachment=True copy=False max_height=1024 max_width=1024 string='Signature'
  • signed_by Char
    copy=False string='Signed By'
  • signed_on Datetime
    copy=False string='Signed On'
  • source_id Many2one
    ondelete='set null'
  • state Selection
    copy=False default='draft' group_expand=True index=True readonly=True selection=SALE_ORDER_STATE string='Status' tracking=3
  • tag_ids Many2many → crm.tag
    column1='order_id' column2='tag_id' comodel_name='crm.tag' relation='sale_order_tag_rel' string='Tags'
  • tax_calculation_rounding_method Selection
    depends=['company_id'] related='company_id.tax_calculation_rounding_method'
  • tax_country_id Many2one → res.country
    comodel_name='res.country' compute='_compute_tax_country_id' compute_sudo=True
  • tax_totals Binary
    compute='_compute_tax_totals' exportable=False
  • team_id Many2one → crm.team
    change_default=True check_company=True comodel_name='crm.team' compute='_compute_team_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" index=True ondelete='set null' precompute=True readonly=False store=True string='Sales Team' tracking=True
  • terms_type Selection
    related='company_id.terms_type'
  • transaction_ids Many2many → payment.transaction
    column1='sale_order_id' column2='transaction_id' comodel_name='payment.transaction' copy=False readonly=True relation='sale_order_transaction_rel' string='Transactions'
  • type_name Char
    compute='_compute_type_name' string='Type Name'
  • user_id Many2one → res.users
    comodel_name='res.users' compute='_compute_user_id' domain=<expr> index=True precompute=True readonly=False store=True string='Salesperson' tracking=2
  • validity_date Date
    compute='_compute_validity_date' copy=False help='Validity of the order, after that you will not able to sign & pay the quotation.' precompute=True readonly=False store=True string='Expiration'
Public methods (24)
  • action_cancel(self)
    Cancel SO after showing the cancel wizard when needed. (cfr :meth:`_show_cancel_wizard`) For post-cancel operations, please only override :meth:`_action_cancel`. note: self.ensure_one() if the wizard is shown.
  • action_confirm(self)
    Confirm the given quotation(s) and set their confirmation date. If the corresponding setting is enabled, also locks the Sale Order. :return: True :rtype: bool :raise: UserError if trying to confirm cancelled SO's
  • action_draft(self)
  • action_lock(self)
  • action_open_business_doc(self)
  • action_open_discount_wizard(self)
  • action_preview_sale_order(self)
  • action_quotation_send(self)
    Opens a wizard to compose an email, with relevant mail template loaded by default
  • action_quotation_sent(self)
    Mark the given draft quotation(s) as sent. :raise: UserError if any given SO is not in draft state.
  • action_unlock(self)
  • action_update_prices(self)
  • action_update_taxes(self)
  • action_view_invoice(self, invoices=False)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • create_document_from_attachment(self, attachment_ids)
    Create the sale orders from given attachment_ids and redirect newly create order view. :param list attachment_ids: List of attachments process. :return: An action redirecting to related sale order view. :rtype: dict
  • get_empty_list_help(self, help_msg)
    @api.model
  • get_portal_last_transaction(self)
  • init(self)
  • message_post(self, **kwargs)
    @api.returns('mail.message', <expr>)
  • onchange(self, values, field_names, fields_spec)
  • payment_action_capture(self)
    Capture all transactions linked to this sale order.
  • payment_action_void(self)
    Void all transactions linked to this sale order.
  • write(self, vals)

New fields (4)
  • author_id Many2one → res.partner
    default=_default_author_id index=True ondelete='set null' string='Author' args: 'res.partner'
  • display_invoice_alert Boolean
    compute='_compute_display_invoice_alert' compute_sudo=True string='Invoice Alert'
  • order_id Many2one → sale.order
    ondelete='cascade' required=True string='Sale Order' args: 'sale.order'
  • recipient_ids Many2many → res.partner
    compute='_compute_recipient_ids' readonly=False string='Recipients' args: 'res.partner'
Public methods (2)
  • action_cancel(self)
  • action_send_mail_and_cancel(self)

New fields (7)
  • company_id Many2one
    related='sale_order_id.company_id'
  • currency_id Many2one
    related='sale_order_id.currency_id'
  • discount_amount Monetary
    string='Amount'
  • discount_percentage Float
    string='Percentage'
  • discount_type Selection
    default='sol_discount' selection=[('sol_discount', 'On All Order Lines'), ('so_discount', 'Global Discount'), ('amount', 'Fixed Amount')]
  • sale_order_id Many2one → sale.order
    default=<expr> required=True args: 'sale.order'
  • tax_ids Many2many → account.tax
    comodel_name='account.tax' domain="[('type_tax_use', '=', 'sale'), ('company_id', '=', company_id)]" help='Taxes to add on the discount line.' string='Taxes'
Public methods (1)
  • action_apply_discount(self)

New fields (60)
  • amount_invoiced Monetary
    compute='_compute_amount_invoiced' compute_sudo=True string='Invoiced Amount'
  • amount_to_invoice Monetary
    compute='_compute_amount_to_invoice' compute_sudo=True string='Un-invoiced Balance'
  • analytic_line_ids One2many → account.analytic.line
    comodel_name='account.analytic.line' inverse_name='so_line' string='Analytic lines'
  • combo_item_id Many2one → product.combo.item
    comodel_name='product.combo.item'
  • company_id Many2one
    index=True precompute=True related='order_id.company_id' store=True
  • company_price_include Selection
    related='company_id.account_price_include'
  • currency_id Many2one
    depends=['order_id.currency_id'] precompute=True related='order_id.currency_id' store=True
  • customer_lead Float
    compute='_compute_customer_lead' help='Number of days between the order confirmation and the shipping of the products to the customer' precompute=True readonly=False required=True store=True string='Lead Time'
  • discount Float
    compute='_compute_discount' digits='Discount' precompute=True readonly=False store=True string='Discount (%)'
  • display_type Selection
    default=False selection=[('line_section', 'Section'), ('line_note', 'Note')]
  • invoice_lines Many2many → account.move.line
    column1='order_line_id' column2='invoice_line_id' comodel_name='account.move.line' copy=False relation='sale_order_line_invoice_rel' string='Invoice Lines'
  • invoice_status Selection
    compute='_compute_invoice_status' selection=[('upselling', 'Upselling Opportunity'), ('invoiced', 'Fully Invoiced'), ('to invoice', 'To Invoice'), ('no', 'Nothing to Invoice')] store=True string='Invoice Status'
  • is_configurable_product Boolean
    depends=['product_template_id'] related='product_template_id.has_configurable_attributes' string='Is the product configurable?'
  • is_downpayment Boolean
    help='Down payments are made when creating invoices from a sales order. They are not copied when duplicating a sales order.' string='Is a down payment'
  • is_expense Boolean
    help='Is true if the sales order line comes from an expense or a vendor bills' string='Is expense'
  • is_product_archived Boolean
    compute='_compute_is_product_archived'
  • linked_line_id Many2one → sale.order.line
    comodel_name='sale.order.line' copy=False domain="[('order_id', '=', order_id)]" index=True ondelete='cascade' string='Linked Order Line'
  • linked_line_ids One2many → sale.order.line
    comodel_name='sale.order.line' inverse_name='linked_line_id' string='Linked Order Lines'
  • linked_virtual_id Char
  • name Text
    compute='_compute_name' precompute=True readonly=False required=True store=True string='Description'
  • order_id Many2one → sale.order
    comodel_name='sale.order' copy=False index=True ondelete='cascade' required=True string='Order Reference'
  • order_partner_id Many2one
    index=True precompute=True related='order_id.partner_id' store=True string='Customer'
  • price_reduce_taxexcl Monetary
    compute='_compute_price_reduce_taxexcl' precompute=True store=True string='Price Reduce Tax excl'
  • price_reduce_taxinc Monetary
    compute='_compute_price_reduce_taxinc' precompute=True store=True string='Price Reduce Tax incl'
  • price_subtotal Monetary
    compute='_compute_amount' precompute=True store=True string='Subtotal'
  • price_tax Float
    compute='_compute_amount' precompute=True store=True string='Total Tax'
  • price_total Monetary
    compute='_compute_amount' precompute=True store=True string='Total'
  • price_unit Float
    compute='_compute_price_unit' min_display_digits='Product Price' precompute=True readonly=False required=True store=True string='Unit Price'
  • pricelist_item_id Many2one → product.pricelist.item
    comodel_name='product.pricelist.item' compute='_compute_pricelist_item_id'
  • product_custom_attribute_value_ids One2many → product.attribute.custom.value
    comodel_name='product.attribute.custom.value' compute='_compute_custom_attribute_values' copy=True inverse_name='sale_order_line_id' precompute=True readonly=False store=True string='Custom Values'
  • product_id Many2one → product.product
    change_default=True comodel_name='product.product' domain="[('sale_ok', '=', True)]" index='btree_not_null' ondelete='restrict' string='Product'
  • product_no_variant_attribute_value_ids Many2many → product.template.attribute.value
    comodel_name='product.template.attribute.value' compute='_compute_no_variant_attribute_values' ondelete='restrict' precompute=True readonly=False store=True string='Extra Values'
  • product_packaging_id Many2one → product.packaging
    check_company=True comodel_name='product.packaging' compute='_compute_product_packaging_id' domain="[('sales', '=', True), ('product_id','=',product_id)]" precompute=True readonly=False store=True string='Packaging'
  • product_packaging_qty Float
    compute='_compute_product_packaging_qty' precompute=True readonly=False store=True string='Packaging Quantity'
  • product_template_attribute_value_ids Many2many
    depends=['product_id'] related='product_id.product_template_attribute_value_ids'
  • product_template_id Many2one → product.template
    comodel_name='product.template' compute='_compute_product_template_id' domain=[('sale_ok', '=', True)] readonly=False search='_search_product_template_id' string='Product Template'
  • product_type Selection
    depends=['product_id'] related='product_id.type'
  • product_uom Many2one → uom.uom
    comodel_name='uom.uom' compute='_compute_product_uom' domain="[('category_id', '=', product_uom_category_id)]" ondelete='restrict' precompute=True readonly=False store=True string='Unit of Measure'
  • product_uom_category_id Many2one
    depends=['product_id'] related='product_id.uom_id.category_id'
  • product_uom_qty Float
    compute='_compute_product_uom_qty' default=1.0 digits='Product Unit of Measure' precompute=True readonly=False required=True store=True string='Quantity'
  • product_uom_readonly Boolean
    compute='_compute_product_uom_readonly'
  • product_updatable Boolean
    compute='_compute_product_updatable' string='Can Edit Product'
  • qty_delivered Float
    compute='_compute_qty_delivered' copy=False default=0.0 digits='Product Unit of Measure' readonly=False store=True string='Delivery Quantity'
  • qty_delivered_method Selection
    compute='_compute_qty_delivered_method' help='According to product configuration, the delivered quantity can be automatically computed by mechanism:\n - Manual: the quantity is set manually on the line\n - Analytic From expenses: the quantity is the quantity sum from posted expenses\n - Timesheet: the quantity is the sum of hours recorded on tasks linked to this sale line\n - Stock Moves: the quantity comes from confirmed pickings\n' precompute=True selection=[('manual', 'Manual'), ('analytic', 'Analytic From Expenses')] store=True string='Method to update delivered qty'
  • qty_invoiced Float
    compute='_compute_qty_invoiced' digits='Product Unit of Measure' store=True string='Invoiced Quantity'
  • qty_invoiced_posted Float
    compute='_compute_qty_invoiced_posted' digits='Product Unit of Measure' string='Invoiced Quantity (posted)'
  • qty_to_invoice Float
    compute='_compute_qty_to_invoice' digits='Product Unit of Measure' store=True string='Quantity To Invoice'
  • salesman_id Many2one
    precompute=True related='order_id.user_id' store=True string='Salesperson'
  • selected_combo_items Char
    store=False
  • sequence Integer
    default=10 string='Sequence'
  • service_tracking Selection
    depends=['product_id'] related='product_id.service_tracking'
  • state Selection
    copy=False precompute=True related='order_id.state' store=True string='Order Status'
  • tax_calculation_rounding_method Selection
    readonly=True related='company_id.tax_calculation_rounding_method' string='Tax calculation rounding method'
  • tax_country_id Many2one
    related='order_id.tax_country_id'
  • tax_id Many2many → account.tax
    check_company=True comodel_name='account.tax' compute='_compute_tax_id' context={'active_test': False} precompute=True readonly=False store=True string='Taxes'
  • technical_price_unit Float
  • translated_product_name Text
    compute='_compute_translated_product_name'
  • untaxed_amount_invoiced Monetary
    compute='_compute_untaxed_amount_invoiced' store=True string='Untaxed Invoiced Amount'
  • untaxed_amount_to_invoice Monetary
    compute='_compute_untaxed_amount_to_invoice' store=True string='Untaxed Amount To Invoice'
  • virtual_id Char
Public methods (5)
  • action_add_from_catalog(self)
  • compute_uom_qty(self, new_qty, stock_move, rounding=True)
  • create(self, vals_list)
    @api.model_create_multi
  • has_valued_move_ids(self)
  • write(self, values)

New fields (1)
  • payment_method Selection
    default=_get_default_payment_method selection_add=[('digital_signature', 'Electronic signature'), ('stripe', 'Credit & Debit card (via Stripe)'), ('paypal', 'PayPal'), ('manual', 'Custom payment instructions')]
Public methods (1)
  • add_payment_methods(self)

New fields (39)
  • campaign_id Many2one → utm.campaign
    comodel_name='utm.campaign' readonly=True string='Campaign'
  • categ_id Many2one → product.category
    comodel_name='product.category' readonly=True string='Product Category'
  • commercial_partner_id Many2one → res.partner
    comodel_name='res.partner' readonly=True string='Customer Entity'
  • company_id Many2one → res.company
    comodel_name='res.company' readonly=True
  • country_id Many2one → res.country
    comodel_name='res.country' readonly=True string='Customer Country'
  • currency_id Many2one → res.currency
    comodel_name='res.currency' compute='_compute_currency_id'
  • date Datetime
    readonly=True string='Order Date'
  • discount Float
    aggregator='avg' readonly=True string='Discount %'
  • discount_amount Monetary
    readonly=True string='Discount Amount'
  • industry_id Many2one → res.partner.industry
    comodel_name='res.partner.industry' readonly=True string='Customer Industry'
  • invoice_status Selection
    readonly=True selection=[('upselling', 'Upselling Opportunity'), ('invoiced', 'Fully Invoiced'), ('to invoice', 'To Invoice'), ('no', 'Nothing to Invoice')] string='Order Invoice Status'
  • line_invoice_status Selection
    readonly=True selection=[('upselling', 'Upselling Opportunity'), ('invoiced', 'Fully Invoiced'), ('to invoice', 'To Invoice'), ('no', 'Nothing to Invoice')] string='Invoice Status'
  • medium_id Many2one → utm.medium
    comodel_name='utm.medium' readonly=True string='Medium'
  • name Char
    readonly=True string='Order Reference'
  • nbr Integer
    readonly=True string='# of Lines'
  • order_reference Reference
    aggregator='count_distinct' selection=[('sale.order', 'Sales Order')] string='Order'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' readonly=True string='Customer'
  • partner_zip Char
    readonly=True string='Customer ZIP'
  • price_subtotal Monetary
    readonly=True string='Untaxed Total'
  • price_total Monetary
    readonly=True string='Total'
  • price_unit Float
    aggregator='avg' readonly=True string='Unit Price'
  • pricelist_id Many2one → product.pricelist
    comodel_name='product.pricelist' readonly=True
  • product_id Many2one → product.product
    comodel_name='product.product' readonly=True string='Product Variant'
  • product_tmpl_id Many2one → product.template
    comodel_name='product.template' readonly=True string='Product'
  • product_uom Many2one → uom.uom
    comodel_name='uom.uom' readonly=True string='Unit of Measure'
  • product_uom_qty Float
    readonly=True string='Qty Ordered'
  • qty_delivered Float
    readonly=True string='Qty Delivered'
  • qty_invoiced Float
    readonly=True string='Qty Invoiced'
  • qty_to_deliver Float
    readonly=True string='Qty To Deliver'
  • qty_to_invoice Float
    readonly=True string='Qty To Invoice'
  • source_id Many2one → utm.source
    comodel_name='utm.source' readonly=True string='Source'
  • state Selection
    readonly=True selection=SALE_ORDER_STATE string='Status'
  • state_id Many2one → res.country.state
    comodel_name='res.country.state' readonly=True string='Customer State'
  • team_id Many2one → crm.team
    comodel_name='crm.team' readonly=True string='Sales Team'
  • untaxed_amount_invoiced Monetary
    readonly=True string='Untaxed Amount Invoiced'
  • untaxed_amount_to_invoice Monetary
    readonly=True string='Untaxed Amount To Invoice'
  • user_id Many2one → res.users
    comodel_name='res.users' readonly=True string='Salesperson'
  • volume Float
    readonly=True string='Volume'
  • weight Float
    readonly=True string='Gross Weight'
Public methods (1)
  • action_open_order(self)

New fields (4)
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    related='company_id.currency_id' string='Currency' args: 'res.currency'
  • invoiced_amount Integer
    compute='_compute_sale_invoiced_amount' compute_sudo=True groups='sales_team.group_sale_salesman' string='Revenues generated by the campaign'
  • quotation_count Integer
    compute='_compute_quotation_count' compute_sudo=True groups='sales_team.group_sale_salesman' args: 'Quotation Count'
Public methods (2)
  • action_redirect_to_invoiced(self)
  • action_redirect_to_quotations(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/17.0/sale
VERSION
VERSION 1.2
CATEGORY
CATEGORYSales/Sales
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Josse Colpaert, Denis Ledoux, Xavier ALT, Christophe Simonis, Xavier Morel, Joren Van Onder, Nicolas Lempereur, qdp-odoo, Géry Debongnie, Aaron Bohy, Jeremy Kersten, GitHub, Damien Bouvy, Yannick Tivisse, Odoo Online, Pierre Masereel, Laurent Smet, Jorge Pinna Puissant, Lucas Perais, Arnold Moyaux, Julien Castiaux, Xavier-Do, Romeo Fragomeli, Victor Feyens, Andrea Grazioso (agr-odoo), Adrien Dieudonné, Paul Morelle, Akim Juillerat, Joseph Caburnay, oco-odoo, Anh Thao Pham (pta), Samuel Degueldre, Achraf (abz), Lucas Lefèvre, Brice bib Bartoletti, Ivan Yelizariev, Prakash Prajapati, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, Pierre Paridans, Arnaud Joset, Romain Estievenart, odoo, roen-odoo, Hubert Van de Walle (huvw), momegahed, Ricardo Gomes Rodrigues (rigr), william-andre, Julien Van Roy, Florian Damhaut, MerlinGuillaume, yhu-odoo, Audric Onockx (auon), aliya, Arthur Detroux (ard), Florian Charlier, Nshimiyimana Séna, Yolann Sabaux, Abdelouahab (abla), John Laterre (jol), Antoine Vandevenne (anv), Jinjiu Liu, gawa-odoo, Demesmaeker, Aurelien van Delft (avd), Achraf, Valentin Chevalier, Renaud Thiry, Pierrot (prro), niyasraphy, jbw-odoo, nda-odoo, bve-odoo, Habib (ayh), damr, Thomas Lefebvre (thle), mehjabinfarsana, alsh-odoo, Matheus Leal Viana (malv), Gaetan Vanden Bergh (gavb), Louis Wicket (wil), Mylyna Hy, Adrien Widart (awt), Maximilien (malb), Gurupreet Singh, Victor Piryns (pivi), Hamza (hisl), Mahamadasif Ansari, amdi-odoo, Gauthier Wala (gawa), Ali Alfie (alal), Tom De Caluwé, Pierre-Yves Dufays, Djamel Touati, Pieter Claeys (clpi), Valentin Vallaeys (vava), Claire Bretton (clbr), Yosua Nicolaus, Levi Siuzdak (sile), Maruan Aguerdouh (magm), Camille Spiritus, Dylan Kiss (dyki), ノウラ, Julien Alardot (jual), FrancoisGe, Michael (mcm), Preksha Chouhan, Horacio Tellez, Horacio Tellez (hote), Valeriya(vchu), Soam (sold), paso-odoo, Adrien Schoffeniels, Hugo Carlier (Huca), tong-odoo, HuylenbroeckFlorent, Anita (anko), Xavier Bol (xbo), Brieuc-brd, SilvioC2C, AH-Yussef, Sarah Bellefroid, “moda”, Mahdi Cheikh Rouhou (macr), Walid (wasa), sesn-odoo, guva-odoo, kdeb@odoo.com, stefanorigano (SRI), Mattis Megevand, Youssef Bashandy, Ethan Vincent, Mathieu (mcou), lase@odoo.com, Maryam Kia, Jordan D. (Joda), Louis (loti), Sven Fuehr, AMZIL Ayoub, yosa-odoo, Mohamed GadAlrab, Nathaniel (naja), vava-odoo, jobl, Julien Carion (juca), kcv-odoo, odoostan, Tanguy Quéguineur, dere-odoo, smna-odoo, Lina (liew), Chrysanthe (chgo), Louis (wil), Junqi Wu, mano-odoo, mathysPaul, Ryan Cen, AhmedElemary57, Ricardo Gomes Rodrigues, st-yes, David Van Droogenbroeck (DROD), Cuong, Nguyen Minh Tran Manh, khsr-odoo, Pierre Lamotte (pila), nikj-odoo, Pierre Pulinckx (pipu), Bastien PIERRE, Corentin Heinix (cohe), kpt-odoo, Bastien (bvdn), Christihan Laurel [Vauxoo], plha-odoo, Mahdi Alijani (malj), Danial Sheikhani, rupa-odoo, Armin-FalDiS, Pulinckx Pierre (PIPU), krip-odoo, utma-odoo, Robin Engels (roen), Sohail JAIDI (soja), Tyler Landivar (tylan), desh, defl, Parth Solanki(PASO), sbel-odoo, Ayushi Gorai, livaios, Mitul shah(mish-odoo), Felipe Garcia Suez, Lionel Piraux (lipi), Ramani Raj, padh-odoo, Eduardo Villalpando Mello, Leila Kerroum Balaguer
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:02:07
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - 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
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module contains all the common features of Sales Management and eCommerce.
    

Code Analysis

Views touched (67)
XML IDNameModelTypeStatus
account_invoice_form Account Invoice account.move xpath Inherits account.view_move_form
account_invoice_groupby_inherit account.move.groupby account.move field Inherits account.view_account_invoice_filter
account_invoice_report_view_tree account.invoice.report.view.tree.inherit.sale account.invoice.report field Inherits account.account_invoice_report_view_tree
account_invoice_view_tree account.move.tree.inherit.sale account.move field Inherits account.view_invoice_tree
crm_lead_partner_kanban_view res.partner.kanban.saleorder.inherit res.partner field Inherits base.res_partner_kanban_view
crm_team_salesteams_view_form crm.team.form crm.team field Inherits sales_team.crm_team_view_form
crm_team_view_kanban_dashboard crm.team.view.kanban.dashboard.inherit.sale crm.team xpath Inherits sales_team.crm_team_view_kanban_dashboard
document_tax_totals document_tax_totals ir.ui.view qweb Inherits account.document_tax_totals_template
mass_cancel_orders_view_form sale.mass.cancel.orders.form sale.mass.cancel.orders form New
payment_link_wizard_view_form payment.link.wizard.form payment.link.wizard field Inherits payment.payment_link_wizard_view_form
payment_provider_form payment.provider.form.inherit.sale payment.provider group Inherits payment.payment_provider_form
portal_my_home_menu_sale Portal layout : sales menu entries ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home_sale Show Quotations / Sales Orders ir.ui.view qweb Inherits portal.portal_my_home
portal_my_orders My Sales Orders ir.ui.view qweb New
portal_my_quotations My Quotations ir.ui.view qweb New
product_document_form product.document.form.sale product.document sheet Inherits product.product_document_form
product_document_kanban product.document.kanban.sale product.document div Inherits product.product_document_kanban
product_document_list product.document.list.sale product.document field Inherits product.product_document_list
product_document_search product.document.search.sale product.document search Inherits product.product_document_search
product_form_view_sale_order_button product.product.sale.order product.product div Inherits product.product_normal_form_view
product_packaging_form_view_sale product.packaging.form.view.sale product.packaging group Inherits product.product_packaging_form_view
product_packaging_tree_view_sale product.packaging.tree.view.sale product.packaging field Inherits product.product_packaging_tree_view
product_template_form_view product.template.form.view.inherit.sale product.template page Inherits product.product_template_form_view
product_template_form_view_sale_order_button product.template.sale.order.button product.template div Inherits product.product_template_only_form_view
product_view_kanban_catalog product.view.kanban.catalog.inherit.sale product.product xpath Inherits product.product_view_kanban_catalog
product_view_search_catalog product.view.search.catalog.inherit.sale product.product filter Inherits product.product_view_search_catalog
report_saleorder report_saleorder ir.ui.view qweb New
report_saleorder_document report_saleorder_document ir.ui.view qweb New
report_saleorder_pro_forma report_saleorder_pro_forma ir.ui.view qweb New
report_saleorder_raw report_saleorder_raw ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.sale res.config.settings xpath Inherits base.res_config_settings_view_form
res_partner_view_buttons res.partner.view.buttons res.partner div Inherits base.view_partner_form
res_partner_view_form_payment_defaultcreditcard res.partner.view.form.payment.defaultcreditcard res.partner button Inherits payment.view_partners_form_payment_defaultcreditcard
res_partner_view_form_property_inherit res.partner.view.form.property.inherit res.partner group Inherits account.view_partner_property_form
sale_order_cancel_view_form sale.order.cancel.form sale.order.cancel form New
sale_order_line_view_form_readonly sale.order.line.form.readonly sale.order.line form New
sale_order_line_view_kanban sale.order.line.kanban sale.order.line kanban New
sale_order_line_wizard_form sale.order.line.wizard.form sale.order.discount form New
sale_order_portal_content Sales Order Portal Content ir.ui.view qweb New
sale_order_portal_content_totals_table sale_order_portal_content_totals_table ir.ui.view qweb New
sale_order_portal_template Sales Order ir.ui.view qweb Inherits portal.portal_sidebar
sale_order_tree sale.order.tree sale.order tree New
sale_order_view_activity sale.order.activity sale.order activity New
sale_order_view_search_inherit_quotation sale.order.search.inherit.quotation sale.order filter Inherits sale.view_sales_order_filter
sale_order_view_search_inherit_sale sale.order.search.inherit.sale sale.order filter Inherits sale.view_sales_order_filter
sale_report_graph_bar sale.report.graph.bar sale.report graph Inherits view_order_product_graph
sale_report_graph_pie sale.report.graph.pie sale.report graph Inherits view_order_product_graph
sale_report_view_tree sale.report.view.tree sale.report tree New
transaction_form_inherit_sale payment.transaction.form.inherit.sale.payment payment.transaction xpath Inherits payment.payment_transaction_form
utm_campaign_view_form utm.campaign.view.form utm.campaign xpath Inherits utm.utm_campaign_view_form
utm_campaign_view_kanban utm.campaign.view.kanban utm.campaign xpath Inherits utm.utm_campaign_view_kanban
view_account_invoice_report_search_inherit account.invoice.report.search.inherit account.invoice.report filter Inherits account.view_account_invoice_report_search
view_order_form sale.order.form sale.order form New
view_order_line_tree sale.order.line.tree sale.order.line tree New
view_order_product_graph sale.report.graph sale.report graph New
view_order_product_pivot sale.report.pivot sale.report pivot New
view_order_product_search sale.report.search sale.report search New
view_order_tree sale.order.tree (orders) sale.order tree Inherits sale_order_tree
view_quotation_tree sale.order.tree (quotes) sale.order tree Inherits sale_order_tree
view_quotation_tree_with_onboarding sale.order.tree sale.order xpath Inherits view_quotation_tree
view_sale_advance_payment_inv Invoice Orders sale.advance.payment.inv form New
view_sale_order_calendar sale.order.calendar sale.order calendar New
view_sale_order_graph sale.order.graph sale.order graph New
view_sale_order_kanban sale.order.kanban sale.order kanban New
view_sale_order_pivot sale.order.pivot sale.order pivot New
view_sales_order_filter sale.order.list.select sale.order search New
view_sales_order_line_filter sale.order.line.select sale.order.line search New
Models touched (35)

New fields (1)
  • business_domain Selection
    ondelete={'sale_order': 'cascade'} selection_add=[('sale_order', 'Sale Order')]
Public methods (0)

No public methods.

New fields (2)
  • allowed_so_line_ids Many2many → sale.order.line
    compute='_compute_allowed_so_line_ids' args: 'sale.order.line'
  • so_line Many2one → sale.order.line
    domain=[('qty_delivered_method', '=', 'analytic')] index='btree_not_null' string='Sales Order Item' args: 'sale.order.line'
Public methods (0)

No public methods.

New fields (1)
  • team_id Many2one → crm.team
    comodel_name='crm.team' string='Sales Team'
Public methods (0)

No public methods.

New fields (5)
  • campaign_id Many2one
    ondelete='set null'
  • medium_id Many2one
    ondelete='set null'
  • sale_order_count Integer
    compute='_compute_origin_so_count' string='Sale Order Count'
  • source_id Many2one
    ondelete='set null'
  • team_id Many2one → crm.team
    compute='_compute_team_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" ondelete='set null' readonly=False store=True string='Sales Team' tracking=True args: 'crm.team'
Public methods (5)
  • action_post(self)
  • action_view_source_sale_orders(self)
  • button_cancel(self)
  • button_draft(self)
  • unlink(self)

New fields (2)
  • is_downpayment Boolean
  • sale_line_ids Many2many → sale.order.line
    copy=False readonly=True string='Sales Order Lines' args: 'sale.order.line', 'sale_order_line_invoice_rel', 'invoice_line_id', 'order_line_id'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (6)
  • invoiced Float
    compute='_compute_invoiced' help='Invoice revenue for the current month. This is the amount the sales channel has invoiced this month. It is used to compute the progression ratio of the current and target revenue on the kanban view.' readonly=True string='Invoiced This Month'
  • invoiced_target Float
    help='Revenue target for the current month (untaxed total of confirmed invoices).' string='Invoicing Target'
  • quotations_amount Float
    compute='_compute_quotations_to_invoice' readonly=True string='Amount of quotations to invoice'
  • quotations_count Integer
    compute='_compute_quotations_to_invoice' readonly=True string='Number of quotations to invoice'
  • sale_order_count Integer
    compute='_compute_sale_order_count' string='# Sale Orders'
  • sales_to_invoice_count Integer
    compute='_compute_sales_to_invoice' readonly=True string='Number of sales to invoice'
Public methods (2)
  • action_primary_channel_button(self)
  • update_invoiced_target(self, value)

New fields (0)

No new fields.

Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)
  • write(self, vals)

New fields (0)

No new fields.

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

New fields (0)

No new fields.

Public methods (3)
  • action_open_step_sale_order_confirmation(self)
    @api.model
  • action_open_step_sample_quotation(self)
    @api.model
    Onboarding step for sending a sample quotation. Open a window to compose an email, with the edi_invoice_template message loaded by default.
  • action_validate_step_payment_provider(self)
    @api.model

New fields (2)
  • amount_paid Monetary
    readonly=True string='Already Paid'
  • confirmation_message Char
    compute='_compute_confirmation_message'
Public methods (0)

No public methods.

New fields (1)
  • so_reference_type Selection
    default='so_name' help='You can set here the communication type that will appear on sales orders.The communication will be given to the customer when they choose the payment method.' selection=[('so_name', 'Based on Document Reference'), ('partner', 'Based on Customer ID')] string='Communication'
Public methods (0)

No public methods.

New fields (2)
  • sale_order_ids Many2many → sale.order
    copy=False readonly=True string='Sales Orders' args: 'sale.order', 'sale_order_transaction_rel', 'transaction_id', 'sale_order_id'
  • sale_order_ids_nbr Integer
    compute='_compute_sale_order_ids_nbr' string='# of Sales Orders'
Public methods (1)
  • action_view_sales_orders(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • sale_order_line_id Many2one → sale.order.line
    ondelete='cascade' string='Sales Order Line' args: 'sale.order.line'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • attached_on Selection
    help="Allows you to share the document with your customers within a sale.\nLeave it empty if you don't want to share this document with sales customer.\nQuotation: the document will be sent to and accessible by customers at any time.\ne.g. this option can be useful to share Product description files.\nConfirmed order: the document will be sent to and accessible by customers.\ne.g. this option can be useful to share User Manual or digital content bought on ecommerce. " selection=[('quotation', 'Quotation'), ('sale_order', 'Confirmed order')] string='Visible at'
Public methods (0)

No public methods.

New fields (1)
  • sales Boolean
    default=True help='If true, the packaging can be used for sales orders' args: 'Sales'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • product_catalog_product_is_in_sale_order Boolean
    compute='_compute_product_is_in_sale_order' search='_search_product_is_in_sale_order'
  • sales_count Float
    compute='_compute_sales_count' digits='Product Unit of Measure' string='Sold'
Public methods (1)
  • action_view_sales(self)

New fields (7)
  • expense_policy Selection
    compute='_compute_expense_policy' default='no' help='Validated expenses and vendor bills can be re-invoiced to a customer at its cost or sales price.' readonly=False selection=[('no', 'No'), ('cost', 'At cost'), ('sales_price', 'Sales price')] store=True string='Re-Invoice Expenses'
  • invoice_policy Selection
    compute='_compute_invoice_policy' help='Ordered Quantity: Invoice quantities ordered by the customer.\nDelivered Quantity: Invoice quantities delivered to the customer.' precompute=True readonly=False selection=[('order', 'Ordered quantities'), ('delivery', 'Delivered quantities')] store=True string='Invoicing Policy'
  • sale_line_warn Selection
    default='no-message' help=WARNING_HELP required=True string='Sales Order Line' args: WARNING_MESSAGE
  • sale_line_warn_msg Text
    string='Message for Sales Order Line'
  • sales_count Float
    compute='_compute_sales_count' digits='Product Unit of Measure' string='Sold'
  • service_type Selection
    compute='_compute_service_type' help='Manually set quantities on order: Invoice based on the manually entered quantity, without creating an analytic account.\nTimesheets on contract: Invoice based on the tracked hours on the related timesheet.\nCreate a task and track hours: Create a task on the sales order validation and track the work hours.' precompute=True readonly=False selection=[('manual', 'Manually set quantities on order')] store=True string='Track Service'
  • visible_expense_policy Boolean
    compute='_compute_visible_expense_policy' string='Re-Invoice Policy visible'
Public methods (3)
  • action_view_sales(self)
  • get_import_templates(self)
    @api.model
  • get_single_product_variant(self)

New fields (7)
  • portal_confirmation_pay Boolean
    string='Online Payment'
  • portal_confirmation_sign Boolean
    default=True string='Online Signature'
  • prepayment_percent Float
    default=1.0 help='The percentage of the amount needed to be paid to confirm quotations.' string='Prepayment percentage'
  • quotation_validity_days Integer
    default=30 help='Days between quotation proposal and expiration. 0 days means automatic expiration is disabled' string='Default Quotation Validity'
  • sale_discount_product_id Many2one → product.product
    check_company=True comodel_name='product.product' domain=[('type', '=', 'service'), ('invoice_policy', '=', 'order')] help='Default product used for discounts' string='Discount Product'
  • sale_down_payment_product_id Many2one → product.product
    check_company=True comodel_name='product.product' domain=[('type', '=', 'service'), ('invoice_policy', '=', 'order')] help='Default product used for down payments' string='Deposit Product'
  • sale_onboarding_payment_method Selection
    selection=[('digital_signature', 'Sign online'), ('paypal', 'PayPal'), ('stripe', 'Stripe'), ('other', 'Pay with another payment provider'), ('manual', 'Manual Payment')] string='Sale onboarding selected payment method'
Public methods (0)

No public methods.

New fields (25)
  • automatic_invoice Boolean
    config_parameter='sale.automatic_invoice' help='The invoice is generated automatically and available in the customer portal when the transaction is confirmed by the payment provider.\nThe invoice is marked as paid and the payment is registered in the payment journal defined in the configuration of the payment provider.\nThis mode is advised if you issue the final invoice at the order and not after the delivery.' string='Automatic Invoice'
  • default_invoice_policy Selection
    default='order' default_model='product.template' selection=[('order', 'Invoice what is ordered'), ('delivery', 'Invoice what is delivered')] string='Invoicing Policy'
  • deposit_default_product_id Many2one
    readonly=False related='company_id.sale_down_payment_product_id'
  • group_auto_done_setting Boolean
    implied_group='sale.group_auto_done_setting' string='Lock Confirmed Sales'
  • group_proforma_sales Boolean
    help='Allows you to send pro-forma invoice.' implied_group='sale.group_proforma_sales' string='Pro-Forma Invoice'
  • group_warning_sale Boolean
    implied_group='sale.group_warning_sale' string='Sale Order Warnings'
  • invoice_mail_template_id Many2one → mail.template
    comodel_name='mail.template' config_parameter='sale.default_invoice_email_template' domain=[('model', '=', 'account.move')] help='Email sent to the customer once the invoice is available.' string='Invoice Email Template'
  • module_delivery Boolean
    args: 'Delivery Methods'
  • module_delivery_bpost Boolean
    args: 'bpost Connector'
  • module_delivery_dhl Boolean
    args: 'DHL Express Connector'
  • module_delivery_easypost Boolean
    args: 'Easypost Connector'
  • module_delivery_fedex Boolean
    args: 'FedEx Connector'
  • module_delivery_sendcloud Boolean
    args: 'Sendcloud Connector'
  • module_delivery_shiprocket Boolean
    args: 'Shiprocket Connector'
  • module_delivery_ups Boolean
    args: 'UPS Connector'
  • module_delivery_usps Boolean
    args: 'USPS Connector'
  • module_product_email_template Boolean
    args: 'Specific Email'
  • module_sale_amazon Boolean
    args: 'Amazon Sync'
  • module_sale_loyalty Boolean
    args: 'Coupons & Loyalty'
  • module_sale_margin Boolean
    args: 'Margins'
  • module_sale_pdf_quote_builder Boolean
    args: 'PDF Quote builder'
  • portal_confirmation_pay Boolean
    readonly=False related='company_id.portal_confirmation_pay'
  • portal_confirmation_sign Boolean
    readonly=False related='company_id.portal_confirmation_sign'
  • prepayment_percent Float
    readonly=False related='company_id.prepayment_percent'
  • quotation_validity_days Integer
    readonly=False related='company_id.quotation_validity_days'
Public methods (1)
  • set_values(self)

New fields (4)
  • sale_order_count Integer
    compute='_compute_sale_order_count' string='Sale Order Count'
  • sale_order_ids One2many → sale.order
    args: 'sale.order', 'partner_id', 'Sales Order'
  • sale_warn Selection
    default='no-message' help=WARNING_HELP args: WARNING_MESSAGE, 'Sales Warnings'
  • sale_warn_msg Text
    args: 'Message for Sales Order'
Public methods (2)
  • action_view_sale_order(self)
  • can_edit_vat(self)
    Can't edit `vat` if there is (non draft) issued SO.

New fields (17)
  • advance_payment_method Selection
    default='delivered' help='A standard invoice is issued with all the order lines ready for invoicing,according to their invoicing policy (based on ordered or delivered quantity).' required=True selection=[('delivered', 'Regular invoice'), ('percentage', 'Down payment (percentage)'), ('fixed', 'Down payment (fixed amount)')] string='Create Invoice'
  • amount Float
    help='The percentage of amount to be invoiced in advance.' string='Down Payment Amount'
  • amount_invoiced Monetary
    compute='_compute_invoice_amounts' help='Only confirmed down payments are considered.' string='Already invoiced'
  • amount_to_invoice Monetary
    compute='_compute_invoice_amounts' help='The amount to invoice = Sale Order Total - Confirmed Down Payments.' string='Amount to invoice'
  • company_id Many2one → res.company
    comodel_name='res.company' compute='_compute_company_id' store=True
  • consolidated_billing Boolean
    default=True help='Create one invoice for all orders related to same customer and same invoicing address' string='Consolidated Billing'
  • count Integer
    compute='_compute_count' string='Order Count'
  • currency_id Many2one → res.currency
    comodel_name='res.currency' compute='_compute_currency_id' store=True
  • deduct_down_payments Boolean
    default=True string='Deduct down payments'
  • deposit_account_id Many2one → account.account
    check_company=True comodel_name='account.account' domain=[('deprecated', '=', False)] help='Account used for deposits' string='Income Account'
  • deposit_taxes_id Many2many → account.tax
    check_company=True comodel_name='account.tax' domain=[('type_tax_use', '=', 'sale')] help='Taxes used for deposits' string='Customer Taxes'
  • display_draft_invoice_warning Boolean
    compute='_compute_display_draft_invoice_warning'
  • display_invoice_amount_warning Boolean
    compute='_compute_display_invoice_amount_warning'
  • fixed_amount Monetary
    help='The fixed amount to be invoiced in advance.' string='Down Payment Amount (Fixed)'
  • has_down_payments Boolean
    compute='_compute_has_down_payments' string='Has down payments'
  • product_id Many2one → product.product
    comodel_name='product.product' compute='_compute_product_id' domain=[('type', '=', 'service')] readonly=False store=True string='Down Payment Product'
  • sale_order_ids Many2many → sale.order
    default=<expr> args: 'sale.order'
Public methods (2)
  • create_invoices(self)
  • view_draft_invoices(self)

New fields (3)
  • has_confirmed_order Boolean
    compute='_compute_has_confirmed_order'
  • sale_order_ids Many2many → sale.order
    comodel_name='sale.order' default=<expr> relation='sale_order_mass_cancel_wizard_rel' string='Sale orders to cancel'
  • sale_orders_count Integer
    compute='_compute_sale_orders_count'
Public methods (1)
  • action_mass_cancel(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (59)
  • amount_invoiced Monetary
    compute='_compute_amount_invoiced' compute_sudo=True string='Already invoiced'
  • amount_paid Float
    compute='_compute_amount_paid' compute_sudo=True
  • amount_tax Monetary
    compute='_compute_amounts' store=True string='Taxes'
  • amount_to_invoice Monetary
    compute='_compute_amount_to_invoice' store=True string='Amount to invoice'
  • amount_total Monetary
    compute='_compute_amounts' store=True string='Total' tracking=4
  • amount_undiscounted Float
    compute='_compute_amount_undiscounted' digits=0 string='Amount Before Discount'
  • amount_untaxed Monetary
    compute='_compute_amounts' store=True string='Untaxed Amount' tracking=5
  • analytic_account_id Many2one → account.analytic.account
    check_company=True comodel_name='account.analytic.account' copy=False domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" string='Analytic Account'
  • authorized_transaction_ids Many2many → payment.transaction
    comodel_name='payment.transaction' compute='_compute_authorized_transaction_ids' compute_sudo=True copy=False string='Authorized Transactions'
  • campaign_id Many2one
    ondelete='set null'
  • client_order_ref Char
    copy=False string='Customer Reference'
  • commitment_date Datetime
    copy=False help='This is the delivery date promised to the customer. If set, the delivery order will be scheduled based on this date rather than product lead times.' string='Delivery Date'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> index=True required=True
  • country_code Char
    related='company_id.account_fiscal_country_id.code' string='Country code'
  • create_date Datetime
    index=True readonly=True string='Creation Date'
  • currency_id Many2one → res.currency
    comodel_name='res.currency' compute='_compute_currency_id' ondelete='restrict' precompute=True store=True
  • currency_rate Float
    compute='_compute_currency_rate' digits=0 precompute=True store=True string='Currency Rate'
  • date_order Datetime
    copy=False default=fields.Datetime.now help='Creation date of draft/sent orders,\nConfirmation date of confirmed orders.' required=True string='Order Date'
  • expected_date Datetime
    compute='_compute_expected_date' help='Delivery date you can promise to the customer, computed from the minimum lead time of the order lines.' store=False string='Expected Date'
  • fiscal_position_id Many2one → account.fiscal.position
    check_company=True comodel_name='account.fiscal.position' compute='_compute_fiscal_position_id' help='Fiscal positions are used to adapt taxes and accounts for particular customers or sales orders/invoices.The default value comes from the customer.' precompute=True readonly=False store=True string='Fiscal Position'
  • has_active_pricelist Boolean
    compute='_compute_has_active_pricelist'
  • invoice_count Integer
    compute='_get_invoiced' string='Invoice Count'
  • invoice_ids Many2many → account.move
    comodel_name='account.move' compute='_get_invoiced' copy=False search='_search_invoice_ids' string='Invoices'
  • invoice_status Selection
    compute='_compute_invoice_status' selection=INVOICE_STATUS store=True string='Invoice Status'
  • is_expired Boolean
    compute='_compute_is_expired' string='Is Expired'
  • journal_id Many2one → account.journal
    check_company=True compute='_compute_journal_id' domain=[('type', '=', 'sale')] help='If set, the SO will invoice in this journal; otherwise the sales journal with the lowest sequence is used.' precompute=True readonly=False store=True string='Invoicing Journal' args: 'account.journal'
  • locked Boolean
    copy=False default=False help='Locked orders cannot be modified.'
  • medium_id Many2one
    ondelete='set null'
  • name Char
    copy=False default=<expr> index='trigram' readonly=False required=True string='Order Reference'
  • note Html
    compute='_compute_note' precompute=True readonly=False store=True string='Terms and conditions'
  • order_line One2many → sale.order.line
    auto_join=True comodel_name='sale.order.line' copy=True inverse_name='order_id' string='Order Lines'
  • origin Char
    help='Reference of the document that generated this sales order request' string='Source Document'
  • partner_credit_warning Text
    compute='_compute_partner_credit_warning'
  • partner_id Many2one → res.partner
    change_default=True check_company=True comodel_name='res.partner' index=True required=True string='Customer' tracking=1
  • partner_invoice_id Many2one → res.partner
    check_company=True comodel_name='res.partner' compute='_compute_partner_invoice_id' index='btree_not_null' precompute=True readonly=False required=True store=True string='Invoice Address'
  • partner_shipping_id Many2one → res.partner
    check_company=True comodel_name='res.partner' compute='_compute_partner_shipping_id' index='btree_not_null' precompute=True readonly=False required=True store=True string='Delivery Address'
  • payment_term_id Many2one → account.payment.term
    check_company=True comodel_name='account.payment.term' compute='_compute_payment_term_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" precompute=True readonly=False store=True string='Payment Terms'
  • prepayment_percent Float
    compute='_compute_prepayment_percent' help='The percentage of the amount needed that must be paid by the customer to confirm the order.' precompute=True readonly=False store=True string='Prepayment percentage'
  • pricelist_id Many2one → product.pricelist
    check_company=True comodel_name='product.pricelist' compute='_compute_pricelist_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='If you change the pricelist, only newly added lines will be affected.' precompute=True readonly=False store=True string='Pricelist' tracking=1
  • reference Char
    copy=False help='The payment communication of this sale order.' string='Payment Ref.'
  • require_payment Boolean
    compute='_compute_require_payment' help='Request a online payment from the customer to confirm the order.' precompute=True readonly=False store=True string='Online payment'
  • require_signature Boolean
    compute='_compute_require_signature' help='Request a online signature from the customer to confirm the order.' precompute=True readonly=False store=True string='Online signature'
  • show_update_fpos Boolean
    store=False string='Has Fiscal Position Changed'
  • show_update_pricelist Boolean
    store=False string='Has Pricelist Changed'
  • signature Image
    attachment=True copy=False max_height=1024 max_width=1024 string='Signature'
  • signed_by Char
    copy=False string='Signed By'
  • signed_on Datetime
    copy=False string='Signed On'
  • source_id Many2one
    ondelete='set null'
  • state Selection
    copy=False default='draft' group_expand=True index=True readonly=True selection=SALE_ORDER_STATE string='Status' tracking=3
  • tag_ids Many2many → crm.tag
    column1='order_id' column2='tag_id' comodel_name='crm.tag' relation='sale_order_tag_rel' string='Tags'
  • tax_calculation_rounding_method Selection
    depends=['company_id'] related='company_id.tax_calculation_rounding_method'
  • tax_country_id Many2one → res.country
    comodel_name='res.country' compute='_compute_tax_country_id' compute_sudo=True
  • tax_totals Binary
    compute='_compute_tax_totals' exportable=False
  • team_id Many2one → crm.team
    change_default=True check_company=True comodel_name='crm.team' compute='_compute_team_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" index=True ondelete='set null' precompute=True readonly=False store=True string='Sales Team' tracking=True
  • terms_type Selection
    related='company_id.terms_type'
  • transaction_ids Many2many → payment.transaction
    column1='sale_order_id' column2='transaction_id' comodel_name='payment.transaction' copy=False readonly=True relation='sale_order_transaction_rel' string='Transactions'
  • type_name Char
    compute='_compute_type_name' string='Type Name'
  • user_id Many2one → res.users
    comodel_name='res.users' compute='_compute_user_id' domain=<expr> index=True precompute=True readonly=False store=True string='Salesperson' tracking=2
  • validity_date Date
    compute='_compute_validity_date' copy=False precompute=True readonly=False store=True string='Expiration'
Public methods (24)
  • action_cancel(self)
    Cancel SO after showing the cancel wizard when needed. (cfr :meth:`_show_cancel_wizard`) For post-cancel operations, please only override :meth:`_action_cancel`. note: self.ensure_one() if the wizard is shown.
  • action_confirm(self)
    Confirm the given quotation(s) and set their confirmation date. If the corresponding setting is enabled, also locks the Sale Order. :return: True :rtype: bool :raise: UserError if trying to confirm cancelled SO's
  • action_draft(self)
  • action_lock(self)
  • action_open_discount_wizard(self)
  • action_preview_sale_order(self)
  • action_quotation_send(self)
    Opens a wizard to compose an email, with relevant mail template loaded by default
  • action_quotation_sent(self)
    Mark the given draft quotation(s) as sent. :raise: UserError if any given SO is not in draft state.
  • action_unlock(self)
  • action_update_prices(self)
  • action_update_taxes(self)
  • action_view_invoice(self, invoices=False)
  • add_option_to_order_with_taxcloud(self)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • get_empty_list_help(self, help_msg)
    @api.model
  • get_portal_last_transaction(self)
  • init(self)
  • message_post(self, **kwargs)
    @api.returns('mail.message', <expr>)
  • onchange(self, values, field_names, fields_spec)
  • payment_action_capture(self)
    Capture all transactions linked to this sale order.
  • payment_action_void(self)
    Void all transactions linked to this sale order.
  • validate_taxes_on_sales_order(self)
  • write(self, values)

New fields (4)
  • author_id Many2one → res.partner
    default=_default_author_id index=True ondelete='set null' string='Author' args: 'res.partner'
  • display_invoice_alert Boolean
    compute='_compute_display_invoice_alert' compute_sudo=True string='Invoice Alert'
  • order_id Many2one → sale.order
    ondelete='cascade' required=True string='Sale Order' args: 'sale.order'
  • recipient_ids Many2many → res.partner
    compute='_compute_recipient_ids' readonly=False string='Recipients' args: 'res.partner'
Public methods (2)
  • action_cancel(self)
  • action_send_mail_and_cancel(self)

New fields (6)
  • company_id Many2one
    related='sale_order_id.company_id'
  • currency_id Many2one
    related='sale_order_id.currency_id'
  • discount_amount Monetary
    string='Amount'
  • discount_percentage Float
    string='Percentage'
  • discount_type Selection
    default='sol_discount' selection=[('sol_discount', 'On All Order Lines'), ('so_discount', 'Global Discount'), ('amount', 'Fixed Amount')]
  • sale_order_id Many2one → sale.order
    default=<expr> required=True args: 'sale.order'
Public methods (1)
  • action_apply_discount(self)

New fields (0)

No new fields.

Public methods (2)
  • confirm_sale_order(self, sample_ratio, so_line)
  • filter_confirmable_sale_orders(cls, sale_order)
    @classmethod

New fields (44)
  • analytic_line_ids One2many → account.analytic.line
    comodel_name='account.analytic.line' inverse_name='so_line' string='Analytic lines'
  • company_id Many2one
    index=True precompute=True related='order_id.company_id' store=True
  • currency_id Many2one
    depends=['order_id.currency_id'] precompute=True related='order_id.currency_id' store=True
  • customer_lead Float
    compute='_compute_customer_lead' help='Number of days between the order confirmation and the shipping of the products to the customer' precompute=True readonly=False required=True store=True string='Lead Time'
  • discount Float
    compute='_compute_discount' digits='Discount' precompute=True readonly=False store=True string='Discount (%)'
  • display_type Selection
    default=False selection=[('line_section', 'Section'), ('line_note', 'Note')]
  • invoice_lines Many2many → account.move.line
    column1='order_line_id' column2='invoice_line_id' comodel_name='account.move.line' copy=False relation='sale_order_line_invoice_rel' string='Invoice Lines'
  • invoice_status Selection
    compute='_compute_invoice_status' selection=[('upselling', 'Upselling Opportunity'), ('invoiced', 'Fully Invoiced'), ('to invoice', 'To Invoice'), ('no', 'Nothing to Invoice')] store=True string='Invoice Status'
  • is_downpayment Boolean
    help='Down payments are made when creating invoices from a sales order. They are not copied when duplicating a sales order.' string='Is a down payment'
  • is_expense Boolean
    help='Is true if the sales order line comes from an expense or a vendor bills' string='Is expense'
  • name Text
    compute='_compute_name' precompute=True readonly=False required=True store=True string='Description'
  • order_id Many2one → sale.order
    comodel_name='sale.order' copy=False index=True ondelete='cascade' required=True string='Order Reference'
  • order_partner_id Many2one
    index=True precompute=True related='order_id.partner_id' store=True string='Customer'
  • price_reduce_taxexcl Monetary
    compute='_compute_price_reduce_taxexcl' precompute=True store=True string='Price Reduce Tax excl'
  • price_reduce_taxinc Monetary
    compute='_compute_price_reduce_taxinc' precompute=True store=True string='Price Reduce Tax incl'
  • price_subtotal Monetary
    compute='_compute_amount' precompute=True store=True string='Subtotal'
  • price_tax Float
    compute='_compute_amount' precompute=True store=True string='Total Tax'
  • price_total Monetary
    compute='_compute_amount' precompute=True store=True string='Total'
  • price_unit Float
    compute='_compute_price_unit' digits='Product Price' precompute=True readonly=False required=True store=True string='Unit Price'
  • pricelist_item_id Many2one → product.pricelist.item
    comodel_name='product.pricelist.item' compute='_compute_pricelist_item_id'
  • product_custom_attribute_value_ids One2many → product.attribute.custom.value
    comodel_name='product.attribute.custom.value' compute='_compute_custom_attribute_values' copy=True inverse_name='sale_order_line_id' precompute=True readonly=False store=True string='Custom Values'
  • product_id Many2one → product.product
    change_default=True comodel_name='product.product' domain="[('sale_ok', '=', True)]" index='btree_not_null' ondelete='restrict' string='Product'
  • product_no_variant_attribute_value_ids Many2many → product.template.attribute.value
    comodel_name='product.template.attribute.value' compute='_compute_no_variant_attribute_values' ondelete='restrict' precompute=True readonly=False store=True string='Extra Values'
  • product_packaging_id Many2one → product.packaging
    check_company=True comodel_name='product.packaging' compute='_compute_product_packaging_id' domain="[('sales', '=', True), ('product_id','=',product_id)]" precompute=True readonly=False store=True string='Packaging'
  • product_packaging_qty Float
    compute='_compute_product_packaging_qty' precompute=True readonly=False store=True string='Packaging Quantity'
  • product_template_id Many2one → product.template
    comodel_name='product.template' compute='_compute_product_template_id' domain=[('sale_ok', '=', True)] readonly=False search='_search_product_template_id' string='Product Template'
  • product_type Selection
    depends=['product_id'] related='product_id.detailed_type'
  • product_uom Many2one → uom.uom
    comodel_name='uom.uom' compute='_compute_product_uom' domain="[('category_id', '=', product_uom_category_id)]" ondelete='restrict' precompute=True readonly=False store=True string='Unit of Measure'
  • product_uom_category_id Many2one
    depends=['product_id'] related='product_id.uom_id.category_id'
  • product_uom_qty Float
    compute='_compute_product_uom_qty' default=1.0 digits='Product Unit of Measure' precompute=True readonly=False required=True store=True string='Quantity'
  • product_uom_readonly Boolean
    compute='_compute_product_uom_readonly'
  • product_updatable Boolean
    compute='_compute_product_updatable' string='Can Edit Product'
  • qty_delivered Float
    compute='_compute_qty_delivered' copy=False default=0.0 digits='Product Unit of Measure' readonly=False store=True string='Delivery Quantity'
  • qty_delivered_method Selection
    compute='_compute_qty_delivered_method' help='According to product configuration, the delivered quantity can be automatically computed by mechanism:\n - Manual: the quantity is set manually on the line\n - Analytic From expenses: the quantity is the quantity sum from posted expenses\n - Timesheet: the quantity is the sum of hours recorded on tasks linked to this sale line\n - Stock Moves: the quantity comes from confirmed pickings\n' precompute=True selection=[('manual', 'Manual'), ('analytic', 'Analytic From Expenses')] store=True string='Method to update delivered qty'
  • qty_invoiced Float
    compute='_compute_qty_invoiced' digits='Product Unit of Measure' store=True string='Invoiced Quantity'
  • qty_to_invoice Float
    compute='_compute_qty_to_invoice' digits='Product Unit of Measure' store=True string='Quantity To Invoice'
  • salesman_id Many2one
    precompute=True related='order_id.user_id' store=True string='Salesperson'
  • sequence Integer
    default=10 string='Sequence'
  • state Selection
    copy=False precompute=True related='order_id.state' store=True string='Order Status'
  • tax_calculation_rounding_method Selection
    readonly=True related='company_id.tax_calculation_rounding_method' string='Tax calculation rounding method'
  • tax_country_id Many2one
    related='order_id.tax_country_id'
  • tax_id Many2many → account.tax
    check_company=True comodel_name='account.tax' compute='_compute_tax_id' context={'active_test': False} precompute=True readonly=False store=True string='Taxes'
  • untaxed_amount_invoiced Monetary
    compute='_compute_untaxed_amount_invoiced' store=True string='Untaxed Invoiced Amount'
  • untaxed_amount_to_invoice Monetary
    compute='_compute_untaxed_amount_to_invoice' store=True string='Untaxed Amount To Invoice'
Public methods (5)
  • action_add_from_catalog(self)
  • compute_uom_qty(self, new_qty, stock_move, rounding=True)
  • create(self, vals_list)
    @api.model_create_multi
  • has_valued_move_ids(self)
  • write(self, values)

New fields (1)
  • payment_method Selection
    default=_get_default_payment_method selection_add=[('digital_signature', 'Electronic signature'), ('stripe', 'Credit & Debit card (via Stripe)'), ('paypal', 'PayPal'), ('manual', 'Custom payment instructions')]
Public methods (1)
  • add_payment_methods(self)

New fields (38)
  • analytic_account_id Many2one → account.analytic.account
    comodel_name='account.analytic.account' readonly=True string='Analytic Account'
  • campaign_id Many2one → utm.campaign
    comodel_name='utm.campaign' readonly=True string='Campaign'
  • categ_id Many2one → product.category
    comodel_name='product.category' readonly=True string='Product Category'
  • commercial_partner_id Many2one → res.partner
    comodel_name='res.partner' readonly=True string='Customer Entity'
  • company_id Many2one → res.company
    comodel_name='res.company' readonly=True
  • country_id Many2one → res.country
    comodel_name='res.country' readonly=True string='Customer Country'
  • currency_id Many2one → res.currency
    comodel_name='res.currency' compute='_compute_currency_id'
  • date Datetime
    readonly=True string='Order Date'
  • discount Float
    group_operator='avg' readonly=True string='Discount %'
  • discount_amount Monetary
    readonly=True string='Discount Amount'
  • industry_id Many2one → res.partner.industry
    comodel_name='res.partner.industry' readonly=True string='Customer Industry'
  • invoice_status Selection
    readonly=True selection=[('upselling', 'Upselling Opportunity'), ('invoiced', 'Fully Invoiced'), ('to invoice', 'To Invoice'), ('no', 'Nothing to Invoice')] string='Invoice Status'
  • medium_id Many2one → utm.medium
    comodel_name='utm.medium' readonly=True string='Medium'
  • name Char
    readonly=True string='Order Reference'
  • nbr Integer
    readonly=True string='# of Lines'
  • order_reference Reference
    group_operator='count_distinct' selection=[('sale.order', 'Sales Order')] string='Related Order'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' readonly=True string='Customer'
  • partner_zip Char
    readonly=True string='Customer ZIP'
  • price_subtotal Monetary
    readonly=True string='Untaxed Total'
  • price_total Monetary
    readonly=True string='Total'
  • pricelist_id Many2one → product.pricelist
    comodel_name='product.pricelist' readonly=True
  • product_id Many2one → product.product
    comodel_name='product.product' readonly=True string='Product Variant'
  • product_tmpl_id Many2one → product.template
    comodel_name='product.template' readonly=True string='Product'
  • product_uom Many2one → uom.uom
    comodel_name='uom.uom' readonly=True string='Unit of Measure'
  • product_uom_qty Float
    readonly=True string='Qty Ordered'
  • qty_delivered Float
    readonly=True string='Qty Delivered'
  • qty_invoiced Float
    readonly=True string='Qty Invoiced'
  • qty_to_deliver Float
    readonly=True string='Qty To Deliver'
  • qty_to_invoice Float
    readonly=True string='Qty To Invoice'
  • source_id Many2one → utm.source
    comodel_name='utm.source' readonly=True string='Source'
  • state Selection
    readonly=True selection=SALE_ORDER_STATE string='Status'
  • state_id Many2one → res.country.state
    comodel_name='res.country.state' readonly=True string='Customer State'
  • team_id Many2one → crm.team
    comodel_name='crm.team' readonly=True string='Sales Team'
  • untaxed_amount_invoiced Monetary
    readonly=True string='Untaxed Amount Invoiced'
  • untaxed_amount_to_invoice Monetary
    readonly=True string='Untaxed Amount To Invoice'
  • user_id Many2one → res.users
    comodel_name='res.users' readonly=True string='Salesperson'
  • volume Float
    readonly=True string='Volume'
  • weight Float
    readonly=True string='Gross Weight'
Public methods (0)

No public methods.

New fields (4)
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    related='company_id.currency_id' string='Currency' args: 'res.currency'
  • invoiced_amount Integer
    compute='_compute_sale_invoiced_amount' compute_sudo=True groups='sales_team.group_sale_salesman' string='Revenues generated by the campaign'
  • quotation_count Integer
    compute='_compute_quotation_count' compute_sudo=True groups='sales_team.group_sale_salesman' args: 'Quotation Count'
Public methods (2)
  • action_redirect_to_invoiced(self)
  • action_redirect_to_quotations(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/16.0/sale
VERSION
VERSION 1.2
CATEGORY
CATEGORYSales/Sales
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Denis Ledoux, Alexis de Lattre, Christophe Simonis, Goffin Simon, Nicolas Lempereur, Thibault Francois, qdp-odoo, Géry Debongnie, Aaron Bohy, Jeremy Kersten, GitHub, Damien Bouvy, Yannick Tivisse, qsm-odoo, SEINLET Nicolas, Pierre Masereel, Laurent Smet, Arnold Moyaux, wan, Aurélien Warnon, Xavier-Do, Romeo Fragomeli, Victor Feyens, Andrea Grazioso (agr-odoo), Adrien Dieudonné, Paul Morelle, William Henrotin, Akim Juillerat, david, oco-odoo, Florent de Labarre, Anh Thao Pham (pta), svs-odoo, Samuel Degueldre, Achraf (abz), Brice bib Bartoletti, Ivan Yelizariev, Philémon van Helden, Nasreddin Boulif (bon), Touati Djamel (otd), Tiffany Chang (tic), Rémy Voet (ryv), Ivàn Todorovich, Gorash, Mathieu Duckerts-Antoine, Pierre Paridans, jbw, Arnaud Joset, William Braeckman, Romain Estievenart, Benjamin Vray, Arnaud Baes, Xavier BOL (xbo), roen-odoo, Hubert Van de Walle (huvw), Miquel Raïch, Laurent Desausoi (lade), momegahed, sofiagvaladze, Nicolas (vin), william-andre, Florian Damhaut, Merlin (megu), MerlinGuillaume, mafo-odoo, Audric Onockx (auon), aliya, william, Arthur Detroux (ard), Florian Charlier, Patrick Hoste, Nshimiyimana Séna, Yolann Sabaux, Abdelouahab (abla), John Laterre (jol), Adrien Minet, Nicolas Bayet, Antoine Vandevenne (anv), Thibault Libioulle, Jinjiu Liu, Laurent Stukkens (LTU), gawa-odoo, Demesmaeker, dbkosky, Aurelien van Delft (avd), Dossogne Bertrand, Achraf, Valentin Chevalier, dht-odoo, Roy Le, Pierrot (prro), niyasraphy, jbw-odoo, nda-odoo, Thomas Lefebvre (thle), mehjabinfarsana, alsh-odoo, Louis Wicket (wil), Mylyna Hy, Adrien Widart (awt), althaf shaik, Maximilien (malb), Victor Piryns (pivi), Hamza (hisl), Gauthier Wala (gawa), Tom De Caluwé, Pierre-Yves Dufays, Pieter Claeys (clpi), Valentin Vallaeys (vava), Louis (loco), Levi Siuzdak (sile), Camille Spiritus, smdc-odoo, ノウラ, Julien Alardot (jual), Horacio Tellez, Horacio Tellez (hote), Valeriya(vchu), Adrien Schoffeniels, Kartik Chavda, HuylenbroeckFlorent, stcc-odoo, Xavier Bol (xbo), SilvioC2C, Ahmed Khalaf (ahkh), Nguyễn Đại Dương, AH-Yussef, Leonardo Pavan Rocha, Sarah Bellefroid, Dawn Hwang, Mahdi Cheikh Rouhou (macr), Mattis Megevand (mmeg), sesn-odoo, guva-odoo, kdeb@odoo.com, stefanorigano (SRI), Adam Heinz, Youssef Bashandy, lase@odoo.com, Jordan D. (Joda), Jérémy Hennecart (jeh), AMZIL Ayoub, yosa-odoo, vava-odoo, Aktiv Software, jobl, Julien Carion (juca), kcv-odoo, dere-odoo, Martin Trigaux (mat), Lina (liew), Junqi Wu, Majed Alhanash (malh), Evgeniia Kotova, Cuong, Nguyen Minh Tran Manh, ticodoo, nikj-odoo, Trinh Duc Do, Marina Alapont, jeep-odoo, Corentin Heinix (cohe), Sander Lienaerts
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:40:50
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - 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
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module contains all the common features of Sales Management and eCommerce.
    

Code Analysis

Views touched (62)
XML IDNameModelTypeStatus
account_invoice_form Account Invoice account.move xpath Inherits account.view_move_form
account_invoice_groupby_inherit account.move.groupby account.move field Inherits account.view_account_invoice_filter
account_invoice_report_view_tree account.invoice.report.view.tree.inherit.sale account.invoice.report field Inherits account.account_invoice_report_view_tree
account_invoice_view_tree account.move.tree.inherit.sale account.move field Inherits account.view_invoice_tree
badge_extra_price Badge Extra Price ir.ui.view qweb New
crm_lead_partner_kanban_view res.partner.kanban.saleorder.inherit res.partner field Inherits base.res_partner_kanban_view
crm_team_salesteams_view_form crm.team.form crm.team div Inherits sales_team.crm_team_view_form
crm_team_view_kanban_dashboard crm.team.view.kanban.dashboard.inherit.sale crm.team xpath Inherits sales_team.crm_team_view_kanban_dashboard
onboarding_quotation_layout_step onboarding_quotation_layout_step ir.ui.view qweb New
payment_checkout_inherit payment_checkout_inherit ir.ui.view qweb Inherits payment.checkout
payment_manage_inherit payment_manage_inherit ir.ui.view qweb Inherits payment.manage
payment_provider_form payment.provider.form.inherit.sale payment.provider group Inherits payment.payment_provider_form
portal_my_home_menu_sale Portal layout : sales menu entries ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home_sale Show Quotations / Sales Orders ir.ui.view qweb Inherits portal.portal_my_home
portal_my_orders My Sales Orders ir.ui.view qweb New
portal_my_quotations My Quotations ir.ui.view qweb New
product_form_view_sale_order_button product.product.sale.order product.product div Inherits product.product_normal_form_view
product_packaging_form_view_sale product.packaging.form.view.sale product.packaging group Inherits product.product_packaging_form_view
product_packaging_tree_view_sale product.packaging.tree.view.sale product.packaging field Inherits product.product_packaging_tree_view
product_template_form_view product.template.form.view.inherit.sale product.template page Inherits product.product_template_form_view
product_template_form_view_sale_order_button product.template.sale.order.button product.template div Inherits product.product_template_only_form_view
report_saleorder report_saleorder ir.ui.view qweb New
report_saleorder_document report_saleorder_document ir.ui.view qweb New
report_saleorder_pro_forma report_saleorder_pro_forma ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.sale res.config.settings xpath Inherits base.res_config_settings_view_form
res_partner_view_buttons res.partner.view.buttons res.partner div Inherits base.view_partner_form
res_partner_view_form_payment_defaultcreditcard res.partner.view.form.payment.defaultcreditcard res.partner button Inherits payment.view_partners_form_payment_defaultcreditcard
res_partner_view_form_property_inherit res.partner.view.form.property.inherit res.partner group Inherits account.view_partner_property_form
sale_onboarding_order_confirmation_step sale_onboarding_order_confirmation_step ir.ui.view qweb New
sale_onboarding_sample_quotation_step sale_onboarding_sample_quotation_step ir.ui.view qweb New
sale_order_cancel_view_form sale.order.cancel.form sale.order.cancel form New
sale_order_line_view_form_readonly sale.order.line.form.readonly sale.order.line form New
sale_order_line_view_kanban sale.order.line.kanban sale.order.line kanban New
sale_order_portal_content Sales Order Portal Content ir.ui.view qweb New
sale_order_portal_content_totals_table sale_order_portal_content_totals_table ir.ui.view qweb New
sale_order_portal_template Sales Order Portal Template ir.ui.view qweb Inherits portal.portal_sidebar
sale_order_view_activity sale.order.activity sale.order activity New
sale_order_view_search_inherit_quotation sale.order.search.inherit.quotation sale.order filter Inherits sale.view_sales_order_filter
sale_order_view_search_inherit_sale sale.order.search.inherit.sale sale.order filter Inherits sale.view_sales_order_filter
sale_quotation_onboarding_panel sale.quotation.onboarding.panel ir.ui.view qweb New
sale_report_view_tree sale.report.view.tree sale.report tree New
transaction_form_inherit_sale payment.transaction.form.inherit.sale.payment payment.transaction xpath Inherits payment.payment_transaction_form
utm_campaign_view_form utm.campaign.view.form utm.campaign xpath Inherits utm.utm_campaign_view_form
utm_campaign_view_kanban utm.campaign.view.kanban utm.campaign xpath Inherits utm.utm_campaign_view_kanban
variants variants ir.ui.view qweb New
view_account_invoice_report_search_inherit account.invoice.report.search.inherit account.invoice.report filter Inherits account.view_account_invoice_report_search
view_order_form sale.order.form sale.order form New
view_order_line_tree sale.order.line.tree sale.order.line tree New
view_order_product_graph sale.report.graph sale.report graph New
view_order_product_pivot sale.report.pivot sale.report pivot New
view_order_product_search sale.report.search sale.report search New
view_order_tree sale.order.tree sale.order tree New
view_quotation_tree sale.order.tree sale.order tree New
view_quotation_tree_with_onboarding sale.order.tree sale.order xpath Inherits view_quotation_tree
view_sale_advance_payment_inv Invoice Orders sale.advance.payment.inv form New
view_sale_order_calendar sale.order.calendar sale.order calendar New
view_sale_order_graph sale.order.graph sale.order graph New
view_sale_order_kanban sale.order.kanban sale.order kanban New
view_sale_order_pivot sale.order.pivot sale.order pivot New
view_sales_order_auto_done_setting sale.order.form sale.order button Inherits sale.view_order_form
view_sales_order_filter sale.order.list.select sale.order search New
view_sales_order_line_filter sale.order.line.select sale.order.line search New
Models touched (30)

New fields (1)
  • business_domain Selection
    ondelete={'sale_order': 'cascade'} selection_add=[('sale_order', 'Sale Order')]
Public methods (0)

No public methods.

New fields (1)
  • so_line Many2one → sale.order.line
    domain=<expr> string='Sales Order Item' args: 'sale.order.line'
Public methods (0)

No public methods.

New fields (1)
  • team_id Many2one → crm.team
    comodel_name='crm.team' string='Sales Team'
Public methods (0)

No public methods.

New fields (5)
  • campaign_id Many2one
    ondelete='set null'
  • medium_id Many2one
    ondelete='set null'
  • sale_order_count Integer
    compute='_compute_origin_so_count' string='Sale Order Count'
  • source_id Many2one
    ondelete='set null'
  • team_id Many2one → crm.team
    compute='_compute_team_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" ondelete='set null' readonly=False store=True string='Sales Team' tracking=True args: 'crm.team'
Public methods (5)
  • action_post(self)
  • action_view_source_sale_orders(self)
  • button_cancel(self)
  • button_draft(self)
  • unlink(self)

New fields (2)
  • is_downpayment Boolean
  • sale_line_ids Many2many → sale.order.line
    copy=False readonly=True string='Sales Order Lines' args: 'sale.order.line', 'sale_order_line_invoice_rel', 'invoice_line_id', 'order_line_id'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (7)
  • invoiced Float
    compute='_compute_invoiced' help='Invoice revenue for the current month. This is the amount the sales channel has invoiced this month. It is used to compute the progression ratio of the current and target revenue on the kanban view.' readonly=True string='Invoiced This Month'
  • invoiced_target Float
    help='Revenue target for the current month (untaxed total of confirmed invoices).' string='Invoicing Target'
  • quotations_amount Float
    compute='_compute_quotations_to_invoice' readonly=True string='Amount of quotations to invoice'
  • quotations_count Integer
    compute='_compute_quotations_to_invoice' readonly=True string='Number of quotations to invoice'
  • sale_order_count Integer
    compute='_compute_sale_order_count' string='# Sale Orders'
  • sales_to_invoice_count Integer
    compute='_compute_sales_to_invoice' readonly=True string='Number of sales to invoice'
  • use_quotations Boolean
    help='Check this box if you send quotations to your customers rather than confirming orders straight away.' string='Quotations'
Public methods (2)
  • action_primary_channel_button(self)
  • update_invoiced_target(self, value)

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 (1)
  • so_reference_type Selection
    default='so_name' help='You can set here the communication type that will appear on sales orders.The communication will be given to the customer when they choose the payment method.' selection=[('so_name', 'Based on Document Reference'), ('partner', 'Based on Customer ID')] string='Communication'
Public methods (0)

No public methods.

New fields (2)
  • sale_order_ids Many2many → sale.order
    copy=False readonly=True string='Sales Orders' args: 'sale.order', 'sale_order_transaction_rel', 'transaction_id', 'sale_order_id'
  • sale_order_ids_nbr Integer
    compute='_compute_sale_order_ids_nbr' string='# of Sales Orders'
Public methods (1)
  • action_view_sales_orders(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • sale_order_line_id Many2one → sale.order.line
    ondelete='cascade' required=True string='Sales Order Line' args: 'sale.order.line'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • sales Boolean
    default=True help='If true, the packaging can be used for sales orders' args: 'Sales'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • sales_count Float
    compute='_compute_sales_count' digits='Product Unit of Measure' string='Sold'
Public methods (1)
  • action_view_sales(self)

New fields (8)
  • expense_policy Selection
    compute='_compute_expense_policy' default='no' help='Expenses and vendor bills can be re-invoiced to a customer.With this option, a validated expense can be re-invoice to a customer at its cost or sales price.' readonly=False store=True string='Re-Invoice Expenses' args: [('no', 'No'), ('cost', 'At cost'), ('sales_price', 'Sales price')]
  • invoice_policy Selection
    compute='_compute_invoice_policy' help='Ordered Quantity: Invoice quantities ordered by the customer.\nDelivered Quantity: Invoice quantities delivered to the customer.' precompute=True readonly=False store=True string='Invoicing Policy' args: [('order', 'Ordered quantities'), ('delivery', 'Delivered quantities')]
  • sale_line_warn Selection
    default='no-message' help=WARNING_HELP required=True args: WARNING_MESSAGE, 'Sales Order Line'
  • sale_line_warn_msg Text
    args: 'Message for Sales Order Line'
  • sales_count Float
    compute='_compute_sales_count' digits='Product Unit of Measure' string='Sold'
  • service_type Selection
    compute='_compute_service_type' help='Manually set quantities on order: Invoice based on the manually entered quantity, without creating an analytic account.\nTimesheets on contract: Invoice based on the tracked hours on the related timesheet.\nCreate a task and track hours: Create a task on the sales order validation and track the work hours.' precompute=True readonly=False store=True string='Track Service' args: [('manual', 'Manually set quantities on order')]
  • visible_expense_policy Boolean
    compute='_compute_visible_expense_policy' args: 'Re-Invoice Policy visible'
  • visible_qty_configurator Boolean
    compute='_compute_visible_qty_configurator' args: 'Quantity visible in configurator'
Public methods (3)
  • action_view_sales(self)
  • create_product_variant(self, product_template_attribute_value_ids)
    Create if necessary and possible and return the id of the product variant matching the given combination for this template. Note AWA: Known "exploit" issues with this method: - This method could be used by an unauthenticated user to generate a lot of useless variants. Unfortunately, after discussing the matter with ODO, there's no easy and user-friendly way to block that behavior. We would have to use captcha/server actions to clean/... that are all not user-friendly/overkill mechanisms. - This method could be used to try to guess what product variant ids are created in the system and what product template ids are configured as "dynamic", but that does not seem like a big deal. The error messages are identical on purpose to avoid giving too much information to a potential attacker: - returning 0 when failing - returning the variant id whether it already existed or not :param product_template_attribute_value_ids: the combination for which to get or create variant :type product_template_attribute_value_ids: list of id of `product.template.attribute.value` :return: id of the product variant matching the combination or 0 :rtype: int
  • get_import_templates(self)
    @api.model

New fields (7)
  • portal_confirmation_pay Boolean
    string='Online Payment'
  • portal_confirmation_sign Boolean
    default=True string='Online Signature'
  • quotation_validity_days Integer
    default=30 string='Default Quotation Validity (Days)'
  • sale_onboarding_order_confirmation_state Selection
    default='not_done' string='State of the onboarding confirmation order step' args: [('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done')]
  • sale_onboarding_payment_method Selection
    string='Sale onboarding selected payment method' args: [('digital_signature', 'Sign online'), ('paypal', 'PayPal'), ('stripe', 'Stripe'), ('other', 'Pay with another payment provider'), ('manual', 'Manual Payment')]
  • sale_onboarding_sample_quotation_state Selection
    default='not_done' string='State of the onboarding sample quotation step' args: [('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done')]
  • sale_quotation_onboarding_state Selection
    default='not_done' string='State of the sale onboarding panel' args: [('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')]
Public methods (4)
  • action_close_sale_quotation_onboarding(self)
    @api.model
    Mark the onboarding panel as closed.
  • action_open_sale_onboarding_payment_provider(self)
    @api.model
    Called by onboarding panel above the quotation list.
  • action_open_sale_onboarding_sample_quotation(self)
    @api.model
    Onboarding step for sending a sample quotation. Open a window to compose an email, with the edi_invoice_template message loaded by default.
  • get_and_update_sale_quotation_onboarding_state(self)
    This method is called on the controller rendering method and ensures that the animations are displayed only one time.

New fields (23)
  • automatic_invoice Boolean
    config_parameter='sale.automatic_invoice' help='The invoice is generated automatically and available in the customer portal when the transaction is confirmed by the payment provider.\nThe invoice is marked as paid and the payment is registered in the payment journal defined in the configuration of the payment provider.\nThis mode is advised if you issue the final invoice at the order and not after the delivery.' string='Automatic Invoice'
  • default_invoice_policy Selection
    default='order' default_model='product.template' args: [('order', 'Invoice what is ordered'), ('delivery', 'Invoice what is delivered')], 'Invoicing Policy'
  • deposit_default_product_id Many2one → product.product
    config_parameter='sale.default_deposit_product_id' domain="[('type', '=', 'service')]" help='Default product used for payment advances' args: 'product.product', 'Deposit Product'
  • group_auto_done_setting Boolean
    implied_group='sale.group_auto_done_setting' string='Lock Confirmed Sales'
  • group_proforma_sales Boolean
    help='Allows you to send pro-forma invoice.' implied_group='sale.group_proforma_sales' string='Pro-Forma Invoice'
  • group_warning_sale Boolean
    implied_group='sale.group_warning_sale' args: 'Sale Order Warnings'
  • invoice_mail_template_id Many2one → mail.template
    comodel_name='mail.template' config_parameter='sale.default_invoice_email_template' domain="[('model', '=', 'account.move')]" help='Email sent to the customer once the invoice is available.' string='Invoice Email Template'
  • module_delivery Boolean
    args: 'Delivery Methods'
  • module_delivery_bpost Boolean
    args: 'bpost Connector'
  • module_delivery_dhl Boolean
    args: 'DHL Express Connector'
  • module_delivery_easypost Boolean
    args: 'Easypost Connector'
  • module_delivery_fedex Boolean
    args: 'FedEx Connector'
  • module_delivery_sendcloud Boolean
    args: 'Sendcloud Connector'
  • module_delivery_ups Boolean
    args: 'UPS Connector'
  • module_delivery_usps Boolean
    args: 'USPS Connector'
  • module_product_email_template Boolean
    args: 'Specific Email'
  • module_sale_amazon Boolean
    args: 'Amazon Sync'
  • module_sale_loyalty Boolean
    args: 'Coupons & Loyalty'
  • module_sale_margin Boolean
    args: 'Margins'
  • portal_confirmation_pay Boolean
    readonly=False related='company_id.portal_confirmation_pay' string='Online Payment'
  • portal_confirmation_sign Boolean
    readonly=False related='company_id.portal_confirmation_sign' string='Online Signature'
  • quotation_validity_days Integer
    readonly=False related='company_id.quotation_validity_days' string='Default Quotation Validity (Days)'
  • use_quotation_validity_days Boolean
    config_parameter='sale.use_quotation_validity_days' args: 'Default Quotation Validity'
Public methods (1)
  • set_values(self)

New fields (4)
  • sale_order_count Integer
    compute='_compute_sale_order_count' string='Sale Order Count'
  • sale_order_ids One2many → sale.order
    args: 'sale.order', 'partner_id', 'Sales Order'
  • sale_warn Selection
    default='no-message' help=WARNING_HELP args: WARNING_MESSAGE, 'Sales Warnings'
  • sale_warn_msg Text
    args: 'Message for Sales Order'
Public methods (2)
  • action_view_sale_order(self)
  • can_edit_vat(self)
    Can't edit `vat` if there is (non draft) issued SO.

New fields (12)
  • advance_payment_method Selection
    default='delivered' help='A standard invoice is issued with all the order lines ready for invoicing,according to their invoicing policy (based on ordered or delivered quantity).' required=True selection=[('delivered', 'Regular invoice'), ('percentage', 'Down payment (percentage)'), ('fixed', 'Down payment (fixed amount)')] string='Create Invoice'
  • amount Float
    help='The percentage of amount to be invoiced in advance, taxes excluded.' string='Down Payment Amount'
  • company_id Many2one → res.company
    comodel_name='res.company' compute='_compute_company_id' store=True
  • count Integer
    compute='_compute_count' string='Order Count'
  • currency_id Many2one → res.currency
    comodel_name='res.currency' compute='_compute_currency_id' store=True
  • deduct_down_payments Boolean
    default=True string='Deduct down payments'
  • deposit_account_id Many2one → account.account
    comodel_name='account.account' domain=[('deprecated', '=', False)] help='Account used for deposits' string='Income Account'
  • deposit_taxes_id Many2many → account.tax
    comodel_name='account.tax' domain=[('type_tax_use', '=', 'sale')] help='Taxes used for deposits' string='Customer Taxes'
  • fixed_amount Monetary
    help='The fixed amount to be invoiced in advance, taxes excluded.' string='Down Payment Amount (Fixed)'
  • has_down_payments Boolean
    compute='_compute_has_down_payments' string='Has down payments'
  • product_id Many2one → product.product
    comodel_name='product.product' compute='_compute_product_id' domain=[('type', '=', 'service')] readonly=False store=True string='Down Payment Product'
  • sale_order_ids Many2many → sale.order
    default=<expr> args: 'sale.order'
Public methods (1)
  • create_invoices(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (51)
  • amount_tax Monetary
    compute='_compute_amounts' store=True string='Taxes'
  • amount_total Monetary
    compute='_compute_amounts' store=True string='Total' tracking=4
  • amount_undiscounted Float
    compute='_compute_amount_undiscounted' digits=0 string='Amount Before Discount'
  • amount_untaxed Monetary
    compute='_compute_amounts' store=True string='Untaxed Amount' tracking=5
  • analytic_account_id Many2one → account.analytic.account
    check_company=True comodel_name='account.analytic.account' copy=False domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" states=READONLY_FIELD_STATES string='Analytic Account'
  • authorized_transaction_ids Many2many → payment.transaction
    comodel_name='payment.transaction' compute='_compute_authorized_transaction_ids' copy=False string='Authorized Transactions'
  • campaign_id Many2one
    ondelete='set null'
  • client_order_ref Char
    copy=False string='Customer Reference'
  • commitment_date Datetime
    copy=False help='This is the delivery date promised to the customer. If set, the delivery order will be scheduled based on this date rather than product lead times.' states=LOCKED_FIELD_STATES string='Delivery Date'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> index=True required=True
  • country_code Char
    related='company_id.account_fiscal_country_id.code' string='Country code'
  • create_date Datetime
    index=True readonly=True string='Creation Date'
  • currency_id Many2one
    depends=['pricelist_id'] ondelete='restrict' precompute=True related='pricelist_id.currency_id' store=True
  • currency_rate Float
    compute='_compute_currency_rate' digits=0 precompute=True store=True string='Currency Rate'
  • date_order Datetime
    copy=False default=fields.Datetime.now help='Creation date of draft/sent orders,\nConfirmation date of confirmed orders.' readonly=False required=True states=READONLY_FIELD_STATES string='Order Date'
  • expected_date Datetime
    compute='_compute_expected_date' help='Delivery date you can promise to the customer, computed from the minimum lead time of the order lines.' store=False string='Expected Date'
  • fiscal_position_id Many2one → account.fiscal.position
    check_company=True comodel_name='account.fiscal.position' compute='_compute_fiscal_position_id' domain="[('company_id', '=', company_id)]" help='Fiscal positions are used to adapt taxes and accounts for particular customers or sales orders/invoices.The default value comes from the customer.' precompute=True readonly=False store=True string='Fiscal Position'
  • invoice_count Integer
    compute='_get_invoiced' string='Invoice Count'
  • invoice_ids Many2many → account.move
    comodel_name='account.move' compute='_get_invoiced' copy=False search='_search_invoice_ids' string='Invoices'
  • invoice_status Selection
    compute='_compute_invoice_status' selection=INVOICE_STATUS store=True string='Invoice Status'
  • is_expired Boolean
    compute='_compute_is_expired' string='Is Expired'
  • medium_id Many2one
    ondelete='set null'
  • name Char
    copy=False default=<expr> index='trigram' readonly=True required=True states={'draft': [('readonly', False)]} string='Order Reference'
  • note Html
    compute='_compute_note' precompute=True readonly=False store=True string='Terms and conditions'
  • order_line One2many → sale.order.line
    auto_join=True comodel_name='sale.order.line' copy=True inverse_name='order_id' states=LOCKED_FIELD_STATES string='Order Lines'
  • origin Char
    help='Reference of the document that generated this sales order request' string='Source Document'
  • partner_credit_warning Text
    compute='_compute_partner_credit_warning'
  • partner_id Many2one → res.partner
    change_default=True comodel_name='res.partner' domain="[('type', '!=', 'private'), ('company_id', 'in', (False, company_id))]" index=True readonly=False required=True states=READONLY_FIELD_STATES string='Customer' tracking=1
  • partner_invoice_id Many2one → res.partner
    comodel_name='res.partner' compute='_compute_partner_invoice_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" precompute=True readonly=False required=True states=LOCKED_FIELD_STATES store=True string='Invoice Address'
  • partner_shipping_id Many2one → res.partner
    comodel_name='res.partner' compute='_compute_partner_shipping_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" precompute=True readonly=False required=True states=LOCKED_FIELD_STATES store=True string='Delivery Address'
  • payment_term_id Many2one → account.payment.term
    check_company=True comodel_name='account.payment.term' compute='_compute_payment_term_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" precompute=True readonly=False store=True string='Payment Terms'
  • pricelist_id Many2one → product.pricelist
    check_company=True comodel_name='product.pricelist' compute='_compute_pricelist_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='If you change the pricelist, only newly added lines will be affected.' precompute=True readonly=False required=True states=READONLY_FIELD_STATES store=True string='Pricelist' tracking=1
  • reference Char
    copy=False help='The payment communication of this sale order.' string='Payment Ref.'
  • require_payment Boolean
    compute='_compute_require_payment' precompute=True readonly=False states=READONLY_FIELD_STATES store=True string='Online Payment'
  • require_signature Boolean
    compute='_compute_require_signature' help='Request a online signature and/or payment to the customer in order to confirm orders automatically.' precompute=True readonly=False states=READONLY_FIELD_STATES store=True string='Online Signature'
  • show_update_fpos Boolean
    store=False string='Has Fiscal Position Changed'
  • show_update_pricelist Boolean
    store=False string='Has Pricelist Changed'
  • signature Image
    attachment=True copy=False max_height=1024 max_width=1024 string='Signature'
  • signed_by Char
    copy=False string='Signed By'
  • signed_on Datetime
    copy=False string='Signed On'
  • source_id Many2one
    ondelete='set null'
  • state Selection
    copy=False default='draft' index=True readonly=True selection=[('draft', 'Quotation'), ('sent', 'Quotation Sent'), ('sale', 'Sales Order'), ('done', 'Locked'), ('cancel', 'Cancelled')] string='Status' tracking=3
  • tag_ids Many2many → crm.tag
    column1='order_id' column2='tag_id' comodel_name='crm.tag' relation='sale_order_tag_rel' string='Tags'
  • tax_country_id Many2one → res.country
    comodel_name='res.country' compute='_compute_tax_country_id' compute_sudo=True
  • tax_totals Binary
    compute='_compute_tax_totals' exportable=False
  • team_id Many2one → crm.team
    change_default=True check_company=True comodel_name='crm.team' compute='_compute_team_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" ondelete='set null' precompute=True readonly=False store=True string='Sales Team' tracking=True
  • terms_type Selection
    related='company_id.terms_type'
  • transaction_ids Many2many → payment.transaction
    column1='sale_order_id' column2='transaction_id' comodel_name='payment.transaction' copy=False readonly=True relation='sale_order_transaction_rel' string='Transactions'
  • type_name Char
    compute='_compute_type_name' string='Type Name'
  • user_id Many2one → res.users
    comodel_name='res.users' compute='_compute_user_id' domain=<expr> index=True precompute=True readonly=False store=True string='Salesperson' tracking=2
  • validity_date Date
    compute='_compute_validity_date' copy=False precompute=True readonly=False states=READONLY_FIELD_STATES store=True string='Expiration'
Public methods (22)
  • action_cancel(self)
    Cancel SO after showing the cancel wizard when needed. (cfr :meth:`_show_cancel_wizard`) For post-cancel operations, please only override :meth:`_action_cancel`. note: self.ensure_one() if the wizard is shown.
  • action_confirm(self)
    Confirm the given quotation(s) and set their confirmation date. If the corresponding setting is enabled, also locks the Sale Order. :return: True :rtype: bool :raise: UserError if trying to confirm locked or cancelled SO's
  • action_done(self)
  • action_draft(self)
  • action_preview_sale_order(self)
  • action_quotation_send(self)
    Opens a wizard to compose an email, with relevant mail template loaded by default
  • action_quotation_sent(self)
    Mark the given draft quotation(s) as sent. :raise: UserError if any given SO is not in draft state.
  • action_unlock(self)
  • action_update_prices(self)
  • action_update_taxes(self)
  • action_view_invoice(self)
  • add_option_to_order_with_taxcloud(self)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • get_empty_list_help(self, help_msg)
    @api.model
  • get_portal_last_transaction(self)
  • init(self)
  • message_post(self, **kwargs)
    @api.returns('mail.message', <expr>)
  • name_get(self)
  • payment_action_capture(self)
    Capture all transactions linked to this sale order.
  • payment_action_void(self)
    Void all transactions linked to this sale order.
  • validate_taxes_on_sales_order(self)

New fields (5)
  • author_id Many2one → res.partner
    default=_default_author_id index=True ondelete='set null' string='Author' args: 'res.partner'
  • display_invoice_alert Boolean
    compute='_compute_display_invoice_alert' compute_sudo=True string='Invoice Alert'
  • email_from Char
    default=_default_email_from string='From'
  • order_id Many2one → sale.order
    ondelete='cascade' required=True string='Sale Order' args: 'sale.order'
  • recipient_ids Many2many → res.partner
    compute='_compute_recipient_ids' readonly=False string='Recipients' args: 'res.partner'
Public methods (2)
  • action_cancel(self)
  • action_send_mail_and_cancel(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (43)
  • analytic_line_ids One2many → account.analytic.line
    comodel_name='account.analytic.line' inverse_name='so_line' string='Analytic lines'
  • company_id Many2one
    index=True precompute=True related='order_id.company_id' store=True
  • currency_id Many2one
    depends=['order_id.currency_id'] precompute=True related='order_id.currency_id' store=True
  • customer_lead Float
    compute='_compute_customer_lead' help='Number of days between the order confirmation and the shipping of the products to the customer' precompute=True readonly=False required=True store=True string='Lead Time'
  • discount Float
    compute='_compute_discount' digits='Discount' precompute=True readonly=False store=True string='Discount (%)'
  • display_type Selection
    default=False selection=[('line_section', 'Section'), ('line_note', 'Note')]
  • invoice_lines Many2many → account.move.line
    column1='order_line_id' column2='invoice_line_id' comodel_name='account.move.line' copy=False relation='sale_order_line_invoice_rel' string='Invoice Lines'
  • invoice_status Selection
    compute='_compute_invoice_status' selection=[('upselling', 'Upselling Opportunity'), ('invoiced', 'Fully Invoiced'), ('to invoice', 'To Invoice'), ('no', 'Nothing to Invoice')] store=True string='Invoice Status'
  • is_downpayment Boolean
    help='Down payments are made when creating invoices from a sales order. They are not copied when duplicating a sales order.' string='Is a down payment'
  • is_expense Boolean
    help='Is true if the sales order line comes from an expense or a vendor bills' string='Is expense'
  • name Text
    compute='_compute_name' precompute=True readonly=False required=True store=True string='Description'
  • order_id Many2one → sale.order
    comodel_name='sale.order' copy=False index=True ondelete='cascade' required=True string='Order Reference'
  • order_partner_id Many2one
    index=True precompute=True related='order_id.partner_id' store=True string='Customer'
  • price_reduce Float
    compute='_compute_price_reduce' digits='Product Price' precompute=True store=True string='Price Reduce'
  • price_reduce_taxexcl Monetary
    compute='_compute_price_reduce_taxexcl' precompute=True store=True string='Price Reduce Tax excl'
  • price_reduce_taxinc Monetary
    compute='_compute_price_reduce_taxinc' precompute=True store=True string='Price Reduce Tax incl'
  • price_subtotal Monetary
    compute='_compute_amount' precompute=True store=True string='Subtotal'
  • price_tax Float
    compute='_compute_amount' precompute=True store=True string='Total Tax'
  • price_total Monetary
    compute='_compute_amount' precompute=True store=True string='Total'
  • price_unit Float
    compute='_compute_price_unit' digits='Product Price' precompute=True readonly=False required=True store=True string='Unit Price'
  • pricelist_item_id Many2one → product.pricelist.item
    comodel_name='product.pricelist.item' compute='_compute_pricelist_item_id'
  • product_custom_attribute_value_ids One2many → product.attribute.custom.value
    comodel_name='product.attribute.custom.value' compute='_compute_custom_attribute_values' copy=True inverse_name='sale_order_line_id' precompute=True readonly=False store=True string='Custom Values'
  • product_id Many2one → product.product
    change_default=True check_company=True comodel_name='product.product' domain="[('sale_ok', '=', True), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" index='btree_not_null' ondelete='restrict' string='Product'
  • product_no_variant_attribute_value_ids Many2many → product.template.attribute.value
    comodel_name='product.template.attribute.value' compute='_compute_no_variant_attribute_values' ondelete='restrict' precompute=True readonly=False store=True string='Extra Values'
  • product_packaging_id Many2one → product.packaging
    check_company=True comodel_name='product.packaging' compute='_compute_product_packaging_id' domain="[('sales', '=', True), ('product_id','=',product_id)]" precompute=True readonly=False store=True string='Packaging'
  • product_packaging_qty Float
    compute='_compute_product_packaging_qty' precompute=True readonly=False store=True string='Packaging Quantity'
  • product_template_id Many2one → product.template
    comodel_name='product.template' compute='_compute_product_template_id' domain=[('sale_ok', '=', True)] readonly=False search='_search_product_template_id' string='Product Template'
  • product_type Selection
    depends=['product_id'] related='product_id.detailed_type'
  • product_uom Many2one → uom.uom
    comodel_name='uom.uom' compute='_compute_product_uom' domain="[('category_id', '=', product_uom_category_id)]" ondelete='restrict' precompute=True readonly=False store=True string='Unit of Measure'
  • product_uom_category_id Many2one
    depends=['product_id'] related='product_id.uom_id.category_id'
  • product_uom_qty Float
    compute='_compute_product_uom_qty' default=1.0 digits='Product Unit of Measure' precompute=True readonly=False required=True store=True string='Quantity'
  • product_uom_readonly Boolean
    compute='_compute_product_uom_readonly'
  • product_updatable Boolean
    compute='_compute_product_updatable' string='Can Edit Product'
  • qty_delivered Float
    compute='_compute_qty_delivered' copy=False default=0.0 digits='Product Unit of Measure' readonly=False store=True string='Delivery Quantity'
  • qty_delivered_method Selection
    compute='_compute_qty_delivered_method' help='According to product configuration, the delivered quantity can be automatically computed by mechanism :\n - Manual: the quantity is set manually on the line\n - Analytic From expenses: the quantity is the quantity sum from posted expenses\n - Timesheet: the quantity is the sum of hours recorded on tasks linked to this sale line\n - Stock Moves: the quantity comes from confirmed pickings\n' precompute=True selection=[('manual', 'Manual'), ('analytic', 'Analytic From Expenses')] store=True string='Method to update delivered qty'
  • qty_invoiced Float
    compute='_compute_qty_invoiced' digits='Product Unit of Measure' store=True string='Invoiced Quantity'
  • qty_to_invoice Float
    compute='_compute_qty_to_invoice' digits='Product Unit of Measure' store=True string='Quantity To Invoice'
  • salesman_id Many2one
    precompute=True related='order_id.user_id' store=True string='Salesperson'
  • sequence Integer
    default=10 string='Sequence'
  • state Selection
    copy=False precompute=True related='order_id.state' store=True string='Order Status'
  • tax_id Many2many → account.tax
    check_company=True comodel_name='account.tax' compute='_compute_tax_id' context={'active_test': False} precompute=True readonly=False store=True string='Taxes'
  • untaxed_amount_invoiced Monetary
    compute='_compute_untaxed_amount_invoiced' store=True string='Untaxed Invoiced Amount'
  • untaxed_amount_to_invoice Monetary
    compute='_compute_untaxed_amount_to_invoice' store=True string='Untaxed Amount To Invoice'
Public methods (4)
  • compute_uom_qty(self, new_qty, stock_move, rounding=True)
  • create(self, vals_list)
    @api.model_create_multi
  • name_get(self)
  • write(self, values)

New fields (1)
  • payment_method Selection
    default=_get_default_payment_method selection_add=[('digital_signature', 'Electronic signature'), ('stripe', 'Credit & Debit card (via Stripe)'), ('paypal', 'PayPal'), ('manual', 'Custom payment instructions')]
Public methods (1)
  • add_payment_methods(self)

New fields (34)
  • analytic_account_id Many2one → account.analytic.account
    readonly=True args: 'account.analytic.account', 'Analytic Account'
  • campaign_id Many2one → utm.campaign
    readonly=True args: 'utm.campaign', 'Campaign'
  • categ_id Many2one → product.category
    readonly=True args: 'product.category', 'Product Category'
  • commercial_partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Customer Entity'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Customer Country'
  • date Datetime
    readonly=True args: 'Order Date'
  • discount Float
    group_operator='avg' readonly=True args: 'Discount %'
  • discount_amount Float
    readonly=True args: 'Discount Amount'
  • industry_id Many2one → res.partner.industry
    readonly=True args: 'res.partner.industry', 'Customer Industry'
  • medium_id Many2one → utm.medium
    readonly=True args: 'utm.medium', 'Medium'
  • name Char
    readonly=True args: 'Order Reference'
  • nbr Integer
    readonly=True args: '# of Lines'
  • order_id Many2one → sale.order
    readonly=True args: 'sale.order', 'Order #'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Customer'
  • price_subtotal Float
    readonly=True args: 'Untaxed Total'
  • price_total Float
    readonly=True args: 'Total'
  • pricelist_id Many2one → product.pricelist
    readonly=True args: 'product.pricelist', 'Pricelist'
  • product_id Many2one → product.product
    readonly=True args: 'product.product', 'Product Variant'
  • product_tmpl_id Many2one → product.template
    readonly=True args: 'product.template', 'Product'
  • product_uom Many2one → uom.uom
    readonly=True args: 'uom.uom', 'Unit of Measure'
  • product_uom_qty Float
    readonly=True args: 'Qty Ordered'
  • qty_delivered Float
    readonly=True args: 'Qty Delivered'
  • qty_invoiced Float
    readonly=True args: 'Qty Invoiced'
  • qty_to_deliver Float
    readonly=True args: 'Qty To Deliver'
  • qty_to_invoice Float
    readonly=True args: 'Qty To Invoice'
  • source_id Many2one → utm.source
    readonly=True args: 'utm.source', 'Source'
  • state Selection
    readonly=True string='Status' args: [('draft', 'Draft Quotation'), ('sent', 'Quotation Sent'), ('sale', 'Sales Order'), ('done', 'Sales Done'), ('cancel', 'Cancelled')]
  • team_id Many2one → crm.team
    readonly=True args: 'crm.team', 'Sales Team'
  • untaxed_amount_invoiced Float
    readonly=True args: 'Untaxed Amount Invoiced'
  • untaxed_amount_to_invoice Float
    readonly=True args: 'Untaxed Amount To Invoice'
  • user_id Many2one → res.users
    readonly=True args: 'res.users', 'Salesperson'
  • volume Float
    readonly=True args: 'Volume'
  • weight Float
    readonly=True args: 'Gross Weight'
Public methods (0)

No public methods.

New fields (4)
  • company_id Many2one → res.company
    default=<expr> readonly=True states={'draft': [('readonly', False)], 'refused': [('readonly', False)]} string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    related='company_id.currency_id' string='Currency' args: 'res.currency'
  • invoiced_amount Integer
    compute='_compute_sale_invoiced_amount' compute_sudo=True groups='sales_team.group_sale_salesman' string='Revenues generated by the campaign'
  • quotation_count Integer
    compute='_compute_quotation_count' compute_sudo=True groups='sales_team.group_sale_salesman' args: 'Quotation Count'
Public methods (2)
  • action_redirect_to_invoiced(self)
  • action_redirect_to_quotations(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/15.0/sale
VERSION
VERSION 1.2
CATEGORY
CATEGORYSales/Sales
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Christophe Simonis, Xavier Morel, Joren Van Onder, Goffin Simon, Mohammed Shekha, Nicolas Martinelli, Nicolas Lempereur, Thibault Francois, qdp-odoo, Jeremy Kersten, GitHub, Damien Bouvy, Barad Mahendra, Wolfgang Taferner, Yannick Tivisse, qsm-odoo, Dharmraj Jhala, Romain Derie, Laurent Smet, Jairo Llopis, Arnold Moyaux, Adrian Torres, wan, Julien Castiaux, Xavier-Do, David Tran, Romeo Fragomeli, Victor Feyens, Andrea Grazioso (agr-odoo), Paul Morelle, Sébastien Theys, david, Nasreddin (bon), oco-odoo, Florent de Labarre, Julien Mougenot, Anh Thao Pham (pta), svs-odoo, Achraf (abz), Carlos Lopez, Brice bib Bartoletti, Adrien Widart, Ivan Yelizariev, Nasreddin Boulif (bon), Touati Djamel (otd), Nicolas Galler, nie, Tiffany Chang (tic), IEL, Rémy Voet (ryv), Mathieu Duckerts-Antoine, Pierre Paridans, Kamen Zhekov, jbw, Arnaud Joset, root, Kevin Baptiste, Xavier BOL (xbo), roen-odoo, Hubert Van de Walle (huvw), Laurent Desausoi (lade), sergio-teruel, Nicolas (vin), william-andre, Florian Damhaut, MerlinGuillaume, yhu-odoo, mafo-odoo, ijas ahammed, Audric Onockx (auon), william, JordiMForgeFlow, Nshimiyimana Séna, Yolann Sabaux, Abdelouahab (abla), John Laterre (jol), Adrien Minet, Nicolas Bayet, Antoine Vandevenne (anv), Jinjiu Liu, Laurent Stukkens (LTU), Demesmaeker, dbkosky, Valentin Chevalier, dht-odoo, Pierrot (prro), niyasraphy, nda-odoo, Habib (ayh), Thomas Lefebvre (thle), mehjabinfarsana, Louis Wicket (wil), Mylyna Hy, Adrien Widart (awt), Maximilien (malb), Victor Piryns (pivi), Gauthier Wala (gawa), Tom De Caluwé, Simon Genin (ges), Valentin Vallaeys (vava), Louis (loco), Pierre Collinet (pic), Sébastien Geelen (sge), ノウラ, Julien Alardot (jual), Horacio Tellez, Valeriya(vchu), Leonardo Pavan Rocha, Mahdi Cheikh Rouhou (macr), Noe Antoine, krha-odoo, Eteil Djoumatchoua (etdj), AMZIL Ayoub, Aktiv Software, jobl, hote, Ninh Duc Hieu, kcv-odoo
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:25:28
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - 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
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module contains all the common features of Sales Management and eCommerce.
    

Code Analysis

Views touched (67)
XML IDNameModelTypeStatus
account_invoice_form Account Invoice account.move data Inherits account.view_move_form
account_invoice_groupby_inherit account.move.groupby account.move xpath Inherits account.view_account_invoice_filter
account_invoice_report_view_tree account.invoice.report.view.tree.inherit.sale account.invoice.report field Inherits account.account_invoice_report_view_tree
account_invoice_view_tree account.move.tree.inherit.sale account.move field Inherits account.view_invoice_tree
acquirer_form_inherit_sale payment.acquirer.form.inherit.sale.payment payment.acquirer xpath Inherits payment.payment_acquirer_form
badge_extra_price Badge Extra Price ir.ui.view qweb New
crm_lead_partner_kanban_view res.partner.kanban.saleorder.inherit res.partner field Inherits base.res_partner_kanban_view
crm_team_salesteams_view_form crm.team.form crm.team xpath Inherits sales_team.crm_team_view_form
crm_team_view_kanban_dashboard crm.team.view.kanban.dashboard.inherit.sale crm.team data Inherits sales_team.crm_team_view_kanban_dashboard
mail_notification_paynow_online Quotation: Sign and Pay mail notification template ir.ui.view qweb Inherits mail.mail_notification_paynow
onboarding_quotation_layout_step onboarding_quotation_layout_step ir.ui.view qweb New
payment_checkout_inherit payment_checkout_inherit ir.ui.view qweb Inherits payment.checkout
payment_manage_inherit payment_manage_inherit ir.ui.view qweb Inherits payment.manage
portal_my_home_menu_sale Portal layout : sales menu entries ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home_sale Show Quotations / Sales Orders ir.ui.view qweb Inherits portal.portal_my_home
portal_my_orders My Sales Orders ir.ui.view qweb New
portal_my_quotations My Quotations ir.ui.view qweb New
product_form_view_sale_order_button product.product.sale.order product.product div Inherits product.product_normal_form_view
product_packaging_form_view_sale product.packaging.form.view.sale product.packaging xpath Inherits product.product_packaging_form_view
product_packaging_tree_view_sale product.packaging.tree.view.sale product.packaging xpath Inherits product.product_packaging_tree_view
product_template_form_view product.template.product.website.form product.template xpath Inherits product.product_template_form_view
product_template_form_view_invoice_policy product.template.invoice.policy product.template field Inherits product.product_template_form_view
product_template_form_view_sale_order_button product.template.sale.order.button product.template div Inherits product.product_template_only_form_view
product_template_sale_form_view product.template.sales product.template xpath Inherits product.product_template_form_view
report_invoice_document_inherit_sale report_invoice_document_inherit_sale ir.ui.view qweb Inherits account.report_invoice_document
report_saleorder report_saleorder ir.ui.view qweb New
report_saleorder_document report_saleorder_document ir.ui.view qweb New
report_saleorder_pro_forma report_saleorder_pro_forma ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.sale res.config.settings xpath Inherits base.res_config_settings_view_form
res_partner_view_buttons res.partner.view.buttons res.partner div Inherits base.view_partner_form
res_partner_view_form_payment_defaultcreditcard res.partner.view.form.payment.defaultcreditcard res.partner button Inherits payment.view_partners_form_payment_defaultcreditcard
res_partner_view_form_property_inherit res.partner.view.form.property.inherit res.partner group Inherits account.view_partner_property_form
sale_onboarding_order_confirmation_form sale.order.confirmation.onboarding.form sale.payment.acquirer.onboarding.wizard xpath Inherits payment.payment_acquirer_onboarding_wizard_form
sale_onboarding_order_confirmation_step sale_onboarding_order_confirmation_step ir.ui.view qweb New
sale_onboarding_sample_quotation_step sale_onboarding_sample_quotation_step ir.ui.view qweb New
sale_order_cancel_view_form sale.order.cancel.form sale.order.cancel form New
sale_order_line_view_form_readonly sale.order.line.form.readonly sale.order.line form New
sale_order_line_view_kanban sale.order.line.kanban sale.order.line kanban New
sale_order_portal_content Sales Order Portal Content ir.ui.view qweb New
sale_order_portal_content_totals_table sale_order_portal_content_totals_table ir.ui.view qweb New
sale_order_portal_template Sales Order Portal Template ir.ui.view qweb Inherits portal.portal_sidebar
sale_order_view_activity sale.order.activity sale.order activity New
sale_order_view_search_inherit_quotation sale.order.search.inherit.quotation sale.order xpath Inherits sale.view_sales_order_filter
sale_order_view_search_inherit_sale sale.order.search.inherit.sale sale.order xpath Inherits sale.view_sales_order_filter
sale_quotation_onboarding_panel sale.quotation.onboarding.panel ir.ui.view qweb New
sale_report_view_tree sale.report.view.tree sale.report tree New
transaction_form_inherit_sale payment.transaction.form.inherit.sale.payment payment.transaction xpath Inherits payment.payment_transaction_form
utm_campaign_view_form utm.campaign.view.form utm.campaign xpath Inherits utm.utm_campaign_view_form
utm_campaign_view_kanban utm.campaign.view.kanban utm.campaign xpath Inherits utm.utm_campaign_view_kanban
variants variants ir.ui.view qweb New
view_account_invoice_report_search_inherit account.invoice.report.search.inherit account.invoice.report xpath Inherits account.view_account_invoice_report_search
view_order_form sale.order.form sale.order form New
view_order_line_tree sale.order.line.tree sale.order.line tree New
view_order_product_graph sale.report.graph sale.report graph New
view_order_product_pivot sale.report.pivot sale.report pivot New
view_order_product_search sale.report.search sale.report search New
view_order_tree sale.order.tree sale.order tree New
view_quotation_tree sale.order.tree sale.order tree New
view_quotation_tree_with_onboarding sale.order.tree sale.order xpath Inherits view_quotation_tree
view_sale_advance_payment_inv Invoice Orders sale.advance.payment.inv form New
view_sale_order_calendar sale.order.calendar sale.order calendar New
view_sale_order_graph sale.order.graph sale.order graph New
view_sale_order_kanban sale.order.kanban sale.order kanban New
view_sale_order_pivot sale.order.pivot sale.order pivot New
view_sales_order_auto_done_setting sale.order.form sale.order xpath Inherits sale.view_order_form
view_sales_order_filter sale.order.list.select sale.order search New
view_sales_order_line_filter sale.order.line.select sale.order.line search New
Models touched (31)

New fields (1)
  • so_line Many2one → sale.order.line
    domain=<expr> string='Sales Order Item' args: 'sale.order.line'
Public methods (0)

No public methods.

New fields (1)
  • team_id Many2one → crm.team
    string='Sales Team' args: 'crm.team'
Public methods (0)

No public methods.

New fields (2)
  • partner_shipping_id Many2one → res.partner
    domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Delivery address for current invoice.' readonly=True states={'draft': [('readonly', False)]} string='Delivery Address' args: 'res.partner'
  • team_id Many2one → crm.team
    default=_get_invoice_default_sale_team domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" ondelete='set null' string='Sales Team' tracking=True args: 'crm.team'
Public methods (4)
  • action_invoice_paid(self)
  • action_post(self)
  • onchange_user_id(self)
    @api.onchange('invoice_user_id')
  • unlink(self)

New fields (1)
  • sale_line_ids Many2many → sale.order.line
    copy=False readonly=True string='Sales Order Lines' args: 'sale.order.line', 'sale_order_line_invoice_rel', 'invoice_line_id', 'order_line_id'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (7)
  • invoiced Float
    compute='_compute_invoiced' help='Invoice revenue for the current month. This is the amount the sales channel has invoiced this month. It is used to compute the progression ratio of the current and target revenue on the kanban view.' readonly=True string='Invoiced This Month'
  • invoiced_target Float
    help='Revenue target for the current month (untaxed total of confirmed invoices).' string='Invoicing Target'
  • quotations_amount Float
    compute='_compute_quotations_to_invoice' readonly=True string='Amount of quotations to invoice'
  • quotations_count Integer
    compute='_compute_quotations_to_invoice' readonly=True string='Number of quotations to invoice'
  • sale_order_count Integer
    compute='_compute_sale_order_count' string='# Sale Orders'
  • sales_to_invoice_count Integer
    compute='_compute_sales_to_invoice' readonly=True string='Number of sales to invoice'
  • use_quotations Boolean
    help='Check this box if you send quotations to your customers rather than confirming orders straight away.' string='Quotations'
Public methods (2)
  • action_primary_channel_button(self)
  • update_invoiced_target(self, value)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • so_reference_type Selection
    default='so_name' help='You can set here the communication type that will appear on sales orders.The communication will be given to the customer when they choose the payment method.' selection=[('so_name', 'Based on Document Reference'), ('partner', 'Based on Customer ID')] string='Communication'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • default_get(self, fields)
    @api.model

New fields (2)
  • sale_order_ids Many2many → sale.order
    copy=False readonly=True string='Sales Orders' args: 'sale.order', 'sale_order_transaction_rel', 'transaction_id', 'sale_order_id'
  • sale_order_ids_nbr Integer
    compute='_compute_sale_order_ids_nbr' string='# of Sales Orders'
Public methods (1)
  • action_view_sales_orders(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • sale_order_line_id Many2one → sale.order.line
    ondelete='cascade' required=True string='Sales Order Line' args: 'sale.order.line'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • sales Boolean
    default=True help='If true, the packaging can be used for sales orders' args: 'Sales'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • sales_count Float
    compute='_compute_sales_count' string='Sold'
Public methods (1)
  • action_view_sales(self)

New fields (8)
  • expense_policy Selection
    default='no' help='Expenses and vendor bills can be re-invoiced to a customer.With this option, a validated expense can be re-invoice to a customer at its cost or sales price.' string='Re-Invoice Expenses' args: [('no', 'No'), ('cost', 'At cost'), ('sales_price', 'Sales price')]
  • invoice_policy Selection
    default='order' help='Ordered Quantity: Invoice quantities ordered by the customer.\nDelivered Quantity: Invoice quantities delivered to the customer.' string='Invoicing Policy' args: [('order', 'Ordered quantities'), ('delivery', 'Delivered quantities')]
  • sale_line_warn Selection
    default='no-message' help=WARNING_HELP required=True args: WARNING_MESSAGE, 'Sales Order Line'
  • sale_line_warn_msg Text
    args: 'Message for Sales Order Line'
  • sales_count Float
    compute='_compute_sales_count' string='Sold'
  • service_type Selection
    default='manual' help='Manually set quantities on order: Invoice based on the manually entered quantity, without creating an analytic account.\nTimesheets on contract: Invoice based on the tracked hours on the related timesheet.\nCreate a task and track hours: Create a task on the sales order validation and track the work hours.' string='Track Service' args: [('manual', 'Manually set quantities on order')]
  • visible_expense_policy Boolean
    compute='_compute_visible_expense_policy' args: 'Re-Invoice Policy visible'
  • visible_qty_configurator Boolean
    compute='_compute_visible_qty_configurator' args: 'Quantity visible in configurator'
Public methods (3)
  • action_view_sales(self)
  • create_product_variant(self, product_template_attribute_value_ids)
    Create if necessary and possible and return the id of the product variant matching the given combination for this template. Note AWA: Known "exploit" issues with this method: - This method could be used by an unauthenticated user to generate a lot of useless variants. Unfortunately, after discussing the matter with ODO, there's no easy and user-friendly way to block that behavior. We would have to use captcha/server actions to clean/... that are all not user-friendly/overkill mechanisms. - This method could be used to try to guess what product variant ids are created in the system and what product template ids are configured as "dynamic", but that does not seem like a big deal. The error messages are identical on purpose to avoid giving too much information to a potential attacker: - returning 0 when failing - returning the variant id whether it already existed or not :param product_template_attribute_value_ids: the combination for which to get or create variant :type product_template_attribute_value_ids: json encoded list of id of `product.template.attribute.value` :return: id of the product variant matching the combination or 0 :rtype: int
  • get_import_templates(self)
    @api.model

New fields (15)
  • analytic_account_id Many2one → account.analytic.account
    readonly=True args: 'account.analytic.account', 'Analytic Account'
  • categ_id Many2one → product.category
    readonly=True args: 'product.category', 'Product Category'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Partner Country'
  • date_order Datetime
    readonly=True string='Date Order'
  • name Char
    readonly=True args: 'Order Reference'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Partner'
  • price_subtotal Float
    readonly=True string='Price Subtotal'
  • price_total Float
    readonly=True args: 'Total'
  • pricelist_id Many2one → product.pricelist
    readonly=True args: 'product.pricelist', 'Pricelist'
  • product_id Many2one → product.product
    readonly=True string='Product' args: 'product.product'
  • product_qty Float
    readonly=True args: 'Product Quantity'
  • product_tmpl_id Many2one → product.template
    readonly=True args: 'product.template', 'Product Template'
  • team_id Many2one → crm.team
    readonly=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    readonly=True args: 'res.users', 'Salesperson'
Public methods (1)
  • init(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (7)
  • portal_confirmation_pay Boolean
    string='Online Payment'
  • portal_confirmation_sign Boolean
    default=True string='Online Signature'
  • quotation_validity_days Integer
    default=30 string='Default Quotation Validity (Days)'
  • sale_onboarding_order_confirmation_state Selection
    default='not_done' string='State of the onboarding confirmation order step' args: [('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done')]
  • sale_onboarding_payment_method Selection
    string='Sale onboarding selected payment method' args: [('digital_signature', 'Sign online'), ('paypal', 'PayPal'), ('stripe', 'Stripe'), ('other', 'Pay with another payment acquirer'), ('manual', 'Manual Payment')]
  • sale_onboarding_sample_quotation_state Selection
    default='not_done' string='State of the onboarding sample quotation step' args: [('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done')]
  • sale_quotation_onboarding_state Selection
    default='not_done' string='State of the sale onboarding panel' args: [('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')]
Public methods (4)
  • action_close_sale_quotation_onboarding(self)
    @api.model
    Mark the onboarding panel as closed.
  • action_open_sale_onboarding_payment_acquirer(self)
    @api.model
    Called by onboarding panel above the quotation list.
  • action_open_sale_onboarding_sample_quotation(self)
    @api.model
    Onboarding step for sending a sample quotation. Open a window to compose an email, with the edi_invoice_template message loaded by default.
  • get_and_update_sale_quotation_onboarding_state(self)
    This method is called on the controller rendering method and ensures that the animations are displayed only one time.

New fields (25)
  • auth_signup_uninvited Selection
    config_parameter='auth_signup.invitation_scope' default='b2b' string='Customer Account' args: [('b2b', 'On invitation'), ('b2c', 'Free sign up')]
  • automatic_invoice Boolean
    config_parameter='sale.automatic_invoice' help='The invoice is generated automatically and available in the customer portal when the transaction is confirmed by the payment acquirer.\nThe invoice is marked as paid and the payment is registered in the payment journal defined in the configuration of the payment acquirer.\nThis mode is advised if you issue the final invoice at the order and not after the delivery.' string='Automatic Invoice'
  • confirmation_mail_template_id Many2one → mail.template
    comodel_name='mail.template' config_parameter='sale.default_confirmation_template' domain="[('model', '=', 'sale.order')]" help='Email sent to the customer once the order is paid.' string='Confirmation Email Template'
  • default_invoice_policy Selection
    default='order' default_model='product.template' args: [('order', 'Invoice what is ordered'), ('delivery', 'Invoice what is delivered')], 'Invoicing Policy'
  • deposit_default_product_id Many2one → product.product
    config_parameter='sale.default_deposit_product_id' domain="[('type', '=', 'service')]" help='Default product used for payment advances' args: 'product.product', 'Deposit Product'
  • group_auto_done_setting Boolean
    implied_group='sale.group_auto_done_setting' args: 'Lock Confirmed Sales'
  • group_proforma_sales Boolean
    help='Allows you to send pro-forma invoice.' implied_group='sale.group_proforma_sales' string='Pro-Forma Invoice'
  • group_sale_delivery_address Boolean
    implied_group='sale.group_delivery_invoice_address' args: 'Customer Addresses'
  • group_warning_sale Boolean
    implied_group='sale.group_warning_sale' args: 'Sale Order Warnings'
  • invoice_mail_template_id Many2one → mail.template
    comodel_name='mail.template' config_parameter='sale.default_invoice_email_template' default=<expr> domain="[('model', '=', 'account.move')]" string='Invoice Email Template'
  • module_delivery Boolean
    args: 'Delivery Methods'
  • module_delivery_bpost Boolean
    args: 'bpost Connector'
  • module_delivery_dhl Boolean
    args: 'DHL Express Connector'
  • module_delivery_easypost Boolean
    args: 'Easypost Connector'
  • module_delivery_fedex Boolean
    args: 'FedEx Connector'
  • module_delivery_ups Boolean
    args: 'UPS Connector'
  • module_delivery_usps Boolean
    args: 'USPS Connector'
  • module_product_email_template Boolean
    args: 'Specific Email'
  • module_sale_amazon Boolean
    args: 'Amazon Sync'
  • module_sale_coupon Boolean
    args: 'Coupons & Promotions'
  • module_sale_margin Boolean
    args: 'Margins'
  • portal_confirmation_pay Boolean
    readonly=False related='company_id.portal_confirmation_pay' string='Online Payment'
  • portal_confirmation_sign Boolean
    readonly=False related='company_id.portal_confirmation_sign' string='Online Signature'
  • quotation_validity_days Integer
    readonly=False related='company_id.quotation_validity_days' string='Default Quotation Validity (Days)'
  • use_quotation_validity_days Boolean
    config_parameter='sale.use_quotation_validity_days' args: 'Default Quotation Validity'
Public methods (1)
  • set_values(self)

New fields (4)
  • sale_order_count Integer
    compute='_compute_sale_order_count' string='Sale Order Count'
  • sale_order_ids One2many → sale.order
    args: 'sale.order', 'partner_id', 'Sales Order'
  • sale_warn Selection
    default='no-message' help=WARNING_HELP args: WARNING_MESSAGE, 'Sales Warnings'
  • sale_warn_msg Text
    args: 'Message for Sales Order'
Public methods (2)
  • action_view_sale_order(self)
  • can_edit_vat(self)
    Can't edit `vat` if there is (non draft) issued SO.

New fields (10)
  • advance_payment_method Selection
    default='delivered' help='A standard invoice is issued with all the order lines ready for invoicing, according to their invoicing policy (based on ordered or delivered quantity).' required=True string='Create Invoice' args: [('delivered', 'Regular invoice'), ('percentage', 'Down payment (percentage)'), ('fixed', 'Down payment (fixed amount)')]
  • amount Float
    digits='Account' help='The percentage of amount to be invoiced in advance, taxes excluded.' args: 'Down Payment Amount'
  • count Integer
    default=_count string='Order Count'
  • currency_id Many2one → res.currency
    default=_default_currency_id string='Currency' args: 'res.currency'
  • deduct_down_payments Boolean
    default=True args: 'Deduct down payments'
  • deposit_account_id Many2one → account.account
    default=_default_deposit_account_id domain=[('deprecated', '=', False)] help='Account used for deposits' string='Income Account' args: 'account.account'
  • deposit_taxes_id Many2many → account.tax
    default=_default_deposit_taxes_id help='Taxes used for deposits' string='Customer Taxes' args: 'account.tax'
  • fixed_amount Monetary
    help='The fixed amount to be invoiced in advance, taxes excluded.' args: 'Down Payment Amount (Fixed)'
  • has_down_payments Boolean
    default=_default_has_down_payment readonly=True args: 'Has down payments'
  • product_id Many2one → product.product
    default=_default_product_id domain=[('type', '=', 'service')] string='Down Payment Product' args: 'product.product'
Public methods (2)
  • create_invoices(self)
  • onchange_advance_payment_method(self)
    @api.onchange('advance_payment_method')

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (45)
  • amount_tax Monetary
    compute='_amount_all' store=True string='Taxes'
  • amount_total Monetary
    compute='_amount_all' store=True string='Total' tracking=4
  • amount_undiscounted Float
    compute='_compute_amount_undiscounted' digits=0 args: 'Amount Before Discount'
  • amount_untaxed Monetary
    compute='_amount_all' store=True string='Untaxed Amount' tracking=5
  • analytic_account_id Many2one → account.analytic.account
    check_company=True compute='_compute_analytic_account_id' copy=False domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='The analytic account related to a sales order.' readonly=False states={'sale': [('readonly', True)], 'done': [('readonly', True)], 'cancel': [('readonly', True)]} store=True args: 'account.analytic.account', 'Analytic Account'
  • authorized_transaction_ids Many2many → payment.transaction
    compute='_compute_authorized_transaction_ids' copy=False string='Authorized Transactions' args: 'payment.transaction'
  • client_order_ref Char
    copy=False string='Customer Reference'
  • commitment_date Datetime
    copy=False help='This is the delivery date promised to the customer. If set, the delivery order will be scheduled based on this date rather than product lead times.' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Delivery Date'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • create_date Datetime
    help='Date on which sales order is created.' index=True readonly=True string='Creation Date'
  • currency_id Many2one
    depends=['pricelist_id'] ondelete='restrict' related='pricelist_id.currency_id' store=True
  • currency_rate Float
    compute='_compute_currency_rate' digits=0 help='The rate of the currency to the currency of rate 1 applicable at the date of the order' store=True args: 'Currency Rate'
  • date_order Datetime
    copy=False default=fields.Datetime.now help='Creation date of draft/sent orders,\nConfirmation date of confirmed orders.' index=True readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Order Date'
  • expected_date Datetime
    compute='_compute_expected_date' help='Delivery date you can promise to the customer, computed from the minimum lead time of the order lines.' store=False args: 'Expected Date'
  • fiscal_position_id Many2one → account.fiscal.position
    check_company=True domain="[('company_id', '=', company_id)]" help='Fiscal positions are used to adapt taxes and accounts for particular customers or sales orders/invoices.The default value comes from the customer.' string='Fiscal Position' args: 'account.fiscal.position'
  • invoice_count Integer
    compute='_get_invoiced' string='Invoice Count'
  • invoice_ids Many2many → account.move
    compute='_get_invoiced' copy=False search='_search_invoice_ids' string='Invoices' args: 'account.move'
  • invoice_status Selection
    compute='_get_invoice_status' store=True string='Invoice Status' args: [('upselling', 'Upselling Opportunity'), ('invoiced', 'Fully Invoiced'), ('to invoice', 'To Invoice'), ('no', 'Nothing to Invoice')]
  • is_expired Boolean
    compute='_compute_is_expired' string='Is expired'
  • name Char
    copy=False default=<expr> index=True readonly=True required=True states={'draft': [('readonly', False)]} string='Order Reference'
  • note Html
    default=_default_note args: 'Terms and conditions'
  • order_line One2many → sale.order.line
    auto_join=True copy=True states={'cancel': [('readonly', True)], 'done': [('readonly', True)]} string='Order Lines' args: 'sale.order.line', 'order_id'
  • origin Char
    help='Reference of the document that generated this sales order request.' string='Source Document'
  • partner_id Many2one → res.partner
    change_default=True domain="[('type', '!=', 'private'), ('company_id', 'in', (False, company_id))]" index=True readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Customer' tracking=1 args: 'res.partner'
  • partner_invoice_id Many2one → res.partner
    domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)], 'sale': [('readonly', False)]} string='Invoice Address' args: 'res.partner'
  • partner_shipping_id Many2one → res.partner
    domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)], 'sale': [('readonly', False)]} string='Delivery Address' args: 'res.partner'
  • payment_term_id Many2one → account.payment.term
    check_company=True domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" string='Payment Terms' args: 'account.payment.term'
  • pricelist_id Many2one → product.pricelist
    check_company=True domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='If you change the pricelist, only newly added lines will be affected.' readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Pricelist' tracking=1 args: 'product.pricelist'
  • reference Char
    copy=False help='The payment communication of this sale order.' string='Payment Ref.'
  • require_payment Boolean
    default=_get_default_require_payment help='Request an online payment to the customer in order to confirm orders automatically.' readonly=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} args: 'Online Payment'
  • require_signature Boolean
    default=_get_default_require_signature help='Request a online signature to the customer in order to confirm orders automatically.' readonly=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} args: 'Online Signature'
  • show_update_pricelist Boolean
    help='Technical Field, True if the pricelist was changed;\n this will then display a recomputation button' string='Has Pricelist Changed'
  • signature Image
    attachment=True copy=False help='Signature received through the portal.' max_height=1024 max_width=1024 args: 'Signature'
  • signed_by Char
    copy=False help='Name of the person that signed the SO.' args: 'Signed By'
  • signed_on Datetime
    copy=False help='Date of the signature.' args: 'Signed On'
  • state Selection
    copy=False default='draft' index=True readonly=True string='Status' tracking=3 args: [('draft', 'Quotation'), ('sent', 'Quotation Sent'), ('sale', 'Sales Order'), ('done', 'Locked'), ('cancel', 'Cancelled')]
  • tag_ids Many2many → crm.tag
    string='Tags' args: 'crm.tag', 'sale_order_tag_rel', 'order_id', 'tag_id'
  • tax_country_id Many2one → res.country
    comodel_name='res.country' compute='_compute_tax_country_id' compute_sudo=True help='Technical field to filter the available taxes depending on the fiscal country and fiscal position.'
  • tax_totals_json Char
    compute='_compute_tax_totals_json'
  • team_id Many2one → crm.team
    change_default=True check_company=True default=_get_default_team domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" ondelete='set null' tracking=True args: 'crm.team', 'Sales Team'
  • terms_type Selection
    related='company_id.terms_type'
  • transaction_ids Many2many → payment.transaction
    copy=False readonly=True string='Transactions' args: 'payment.transaction', 'sale_order_transaction_rel', 'sale_order_id', 'transaction_id'
  • type_name Char
    compute='_compute_type_name' args: 'Type Name'
  • user_id Many2one → res.users
    default=<expr> domain=<expr> index=True string='Salesperson' tracking=2 args: 'res.users'
  • validity_date Date
    copy=False default=_default_validity_date readonly=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Expiration'
Public methods (25)
  • action_cancel(self)
  • action_confirm(self)
  • action_done(self)
  • action_draft(self)
  • action_quotation_send(self)
    Opens a wizard to compose an email, with relevant mail template loaded by default
  • action_quotation_sent(self)
  • action_unlock(self)
  • action_view_invoice(self)
  • add_option_to_order_with_taxcloud(self)
  • copy_data(self, default=None)
  • create(self, vals)
    @api.model
  • get_empty_list_help(self, help)
    @api.model
  • get_portal_last_transaction(self)
  • has_to_be_paid(self, include_draft=False)
  • has_to_be_signed(self, include_draft=False)
  • message_post(self, **kwargs)
    @api.returns('mail.message', <expr>)
  • name_get(self)
  • onchange_partner_id(self)
    @api.onchange('partner_id')
    Update the following fields when the partner is changed: - Pricelist - Payment terms - Invoice address - Delivery address - Sales Team
  • onchange_partner_shipping_id(self)
    @api.onchange('partner_shipping_id', 'partner_id', 'company_id')
    Trigger the change of fiscal position when the shipping address is modified.
  • onchange_user_id(self)
    @api.onchange('user_id')
  • payment_action_capture(self)
    Capture all transactions linked to this sale order.
  • payment_action_void(self)
    Void all transactions linked to this sale order.
  • preview_sale_order(self)
  • update_prices(self)
  • validate_taxes_on_sales_order(self)

New fields (2)
  • display_invoice_alert Boolean
    compute='_compute_display_invoice_alert' args: 'Invoice Alert'
  • order_id Many2one → sale.order
    ondelete='cascade' required=True string='Sale Order' args: 'sale.order'
Public methods (1)
  • action_cancel(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (43)
  • analytic_line_ids One2many → account.analytic.line
    string='Analytic lines' args: 'account.analytic.line', 'so_line'
  • analytic_tag_ids Many2many → account.analytic.tag
    compute='_compute_analytic_tag_ids' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" readonly=False store=True string='Analytic Tags' args: 'account.analytic.tag'
  • company_id Many2one
    index=True related='order_id.company_id' store=True string='Company'
  • currency_id Many2one
    depends=['order_id.currency_id'] related='order_id.currency_id' store=True string='Currency'
  • customer_lead Float
    default=0.0 help='Number of days between the order confirmation and the shipping of the products to the customer' required=True args: 'Lead Time'
  • discount Float
    default=0.0 digits='Discount' string='Discount (%)'
  • display_type Selection
    default=False help='Technical field for UX purpose.' args: [('line_section', 'Section'), ('line_note', 'Note')]
  • invoice_lines Many2many → account.move.line
    copy=False string='Invoice Lines' args: 'account.move.line', 'sale_order_line_invoice_rel', 'order_line_id', 'invoice_line_id'
  • invoice_status Selection
    compute='_compute_invoice_status' default='no' store=True string='Invoice Status' args: [('upselling', 'Upselling Opportunity'), ('invoiced', 'Fully Invoiced'), ('to invoice', 'To Invoice'), ('no', 'Nothing to Invoice')]
  • is_downpayment Boolean
    help='Down payments are made when creating invoices from a sales order. They are not copied when duplicating a sales order.' string='Is a down payment'
  • is_expense Boolean
    help='Is true if the sales order line comes from an expense or a vendor bills' args: 'Is expense'
  • name Text
    required=True string='Description'
  • order_id Many2one → sale.order
    copy=False index=True ondelete='cascade' required=True string='Order Reference' args: 'sale.order'
  • order_partner_id Many2one
    index=True related='order_id.partner_id' store=True string='Customer'
  • price_reduce Float
    compute='_compute_price_reduce' digits='Product Price' store=True string='Price Reduce'
  • price_reduce_taxexcl Monetary
    compute='_compute_price_reduce_taxexcl' store=True string='Price Reduce Tax excl'
  • price_reduce_taxinc Monetary
    compute='_compute_price_reduce_taxinc' store=True string='Price Reduce Tax inc'
  • price_subtotal Monetary
    compute='_compute_amount' store=True string='Subtotal'
  • price_tax Float
    compute='_compute_amount' store=True string='Total Tax'
  • price_total Monetary
    compute='_compute_amount' store=True string='Total'
  • price_unit Float
    default=0.0 digits='Product Price' required=True args: 'Unit Price'
  • product_custom_attribute_value_ids One2many → product.attribute.custom.value
    copy=True string='Custom Values' args: 'product.attribute.custom.value', 'sale_order_line_id'
  • product_id Many2one → product.product
    change_default=True check_company=True domain="[('sale_ok', '=', True), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" ondelete='restrict' string='Product' args: 'product.product'
  • product_no_variant_attribute_value_ids Many2many → product.template.attribute.value
    ondelete='restrict' string='Extra Values' args: 'product.template.attribute.value'
  • product_packaging_id Many2one → product.packaging
    check_company=True default=False domain="[('sales', '=', True), ('product_id','=',product_id)]" string='Packaging' args: 'product.packaging'
  • product_packaging_qty Float
    args: 'Packaging Quantity'
  • product_template_id Many2one → product.template
    domain=[('sale_ok', '=', True)] related='product_id.product_tmpl_id' string='Product Template' args: 'product.template'
  • product_uom Many2one → uom.uom
    domain="[('category_id', '=', product_uom_category_id)]" ondelete='restrict' string='Unit of Measure' args: 'uom.uom'
  • product_uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • product_uom_qty Float
    default=1.0 digits='Product Unit of Measure' required=True string='Quantity'
  • product_uom_readonly Boolean
    compute='_compute_product_uom_readonly'
  • product_updatable Boolean
    compute='_compute_product_updatable' default=True string='Can Edit Product'
  • qty_delivered Float
    compute='_compute_qty_delivered' copy=False default=0.0 digits='Product Unit of Measure' inverse='_inverse_qty_delivered' store=True args: 'Delivered Quantity'
  • qty_delivered_manual Float
    copy=False default=0.0 digits='Product Unit of Measure' args: 'Delivered Manually'
  • qty_delivered_method Selection
    compute='_compute_qty_delivered_method' help='According to product configuration, the delivered quantity can be automatically computed by mechanism :\n - Manual: the quantity is set manually on the line\n - Analytic From expenses: the quantity is the quantity sum from posted expenses\n - Timesheet: the quantity is the sum of hours recorded on tasks linked to this sale line\n - Stock Moves: the quantity comes from confirmed pickings\n' store=True string='Method to update delivered qty' args: [('manual', 'Manual'), ('analytic', 'Analytic From Expenses')]
  • qty_invoiced Float
    compute='_compute_qty_invoiced' digits='Product Unit of Measure' store=True string='Invoiced Quantity'
  • qty_to_invoice Float
    compute='_get_to_invoice_qty' digits='Product Unit of Measure' store=True string='To Invoice Quantity'
  • salesman_id Many2one
    related='order_id.user_id' store=True string='Salesperson'
  • sequence Integer
    default=10 string='Sequence'
  • state Selection
    copy=False related='order_id.state' store=True string='Order Status'
  • tax_id Many2many → account.tax
    check_company=True context={'active_test': False} string='Taxes' args: 'account.tax'
  • untaxed_amount_invoiced Monetary
    compute='_compute_untaxed_amount_invoiced' store=True args: 'Untaxed Invoiced Amount'
  • untaxed_amount_to_invoice Monetary
    compute='_compute_untaxed_amount_to_invoice' store=True args: 'Untaxed Amount To Invoice'
Public methods (7)
  • compute_uom_qty(self, new_qty, stock_move, rounding=True)
  • create(self, vals_list)
    @api.model_create_multi
  • get_sale_order_line_multiline_description_sale(self, product)
    Compute a default multiline description for this sales order line. In most cases the product description is enough but sometimes we need to append information that only exists on the sale order line itself. e.g: - custom attributes and attributes that don't create variants, both introduced by the "product configurator" - in event_sale we need to know specifically the sales order line as well as the product to generate the name: the product is not sufficient because we also need to know the event_id and the event_ticket_id (both which belong to the sale order line).
  • name_get(self)
  • product_id_change(self)
    @api.onchange('product_id')
  • product_uom_change(self)
    @api.onchange('product_uom', 'product_uom_qty')
  • write(self, values)

New fields (1)
  • payment_method Selection
    default=_get_default_payment_method selection_add=[('digital_signature', 'Electronic signature'), ('stripe', 'Credit & Debit card (via Stripe)'), ('paypal', 'PayPal'), ('other', 'Other payment acquirer'), ('manual', 'Custom payment instructions')]
Public methods (1)
  • add_payment_methods(self, *args, **kwargs)

New fields (34)
  • analytic_account_id Many2one → account.analytic.account
    readonly=True args: 'account.analytic.account', 'Analytic Account'
  • campaign_id Many2one → utm.campaign
    args: 'utm.campaign', 'Campaign'
  • categ_id Many2one → product.category
    readonly=True args: 'product.category', 'Product Category'
  • commercial_partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Customer Entity'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Customer Country'
  • date Datetime
    readonly=True args: 'Order Date'
  • discount Float
    readonly=True args: 'Discount %'
  • discount_amount Float
    readonly=True args: 'Discount Amount'
  • industry_id Many2one → res.partner.industry
    readonly=True args: 'res.partner.industry', 'Customer Industry'
  • medium_id Many2one → utm.medium
    args: 'utm.medium', 'Medium'
  • name Char
    readonly=True args: 'Order Reference'
  • nbr Integer
    readonly=True args: '# of Lines'
  • order_id Many2one → sale.order
    readonly=True args: 'sale.order', 'Order #'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Customer'
  • price_subtotal Float
    readonly=True args: 'Untaxed Total'
  • price_total Float
    readonly=True args: 'Total'
  • pricelist_id Many2one → product.pricelist
    readonly=True args: 'product.pricelist', 'Pricelist'
  • product_id Many2one → product.product
    readonly=True args: 'product.product', 'Product Variant'
  • product_tmpl_id Many2one → product.template
    readonly=True args: 'product.template', 'Product'
  • product_uom Many2one → uom.uom
    readonly=True args: 'uom.uom', 'Unit of Measure'
  • product_uom_qty Float
    readonly=True args: 'Qty Ordered'
  • qty_delivered Float
    readonly=True args: 'Qty Delivered'
  • qty_invoiced Float
    readonly=True args: 'Qty Invoiced'
  • qty_to_deliver Float
    readonly=True args: 'Qty To Deliver'
  • qty_to_invoice Float
    readonly=True args: 'Qty To Invoice'
  • source_id Many2one → utm.source
    args: 'utm.source', 'Source'
  • state Selection
    readonly=True string='Status' args: [('draft', 'Draft Quotation'), ('sent', 'Quotation Sent'), ('sale', 'Sales Order'), ('done', 'Sales Done'), ('cancel', 'Cancelled')]
  • team_id Many2one → crm.team
    readonly=True args: 'crm.team', 'Sales Team'
  • untaxed_amount_invoiced Float
    readonly=True args: 'Untaxed Amount Invoiced'
  • untaxed_amount_to_invoice Float
    readonly=True args: 'Untaxed Amount To Invoice'
  • user_id Many2one → res.users
    readonly=True args: 'res.users', 'Salesperson'
  • volume Float
    readonly=True args: 'Volume'
  • weight Float
    readonly=True args: 'Gross Weight'
Public methods (1)
  • init(self)

New fields (4)
  • company_id Many2one → res.company
    default=<expr> readonly=True states={'draft': [('readonly', False)], 'refused': [('readonly', False)]} string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    related='company_id.currency_id' string='Currency' args: 'res.currency'
  • invoiced_amount Integer
    compute='_compute_sale_invoiced_amount' default=0 string='Revenues generated by the campaign'
  • quotation_count Integer
    compute='_compute_quotation_count' groups='sales_team.group_sale_salesman' args: 'Quotation Count'
Public methods (2)
  • action_redirect_to_invoiced(self)
  • action_redirect_to_quotations(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/14.0/sale
VERSION
VERSION 1.1
CATEGORY
CATEGORYSales/Sales
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Olivier Dony, Thibault Delavallée, Christophe Simonis, Xavier Morel, Joren Van Onder, Goffin Simon, Mohammed Shekha, Nicolas Martinelli, Nicolas Lempereur, Thibault Francois, qdp-odoo, Aaron Bohy, Pedro M. Baeza, Jeremy Kersten, Sylvain LE GAL, GitHub, Damien Bouvy, Barad Mahendra, Wolfgang Taferner, Yannick Tivisse, Nicolas Seinlet, Romain Derie, Laurent Smet, Adrien Dieudonne, Jorge Pinna Puissant, Jairo Llopis, Alexandre Kühn, Toufik Ben Jaa, Arnold Moyaux, Adrian Torres, wan, mreficent, Julien Castiaux, Antoine Prieels, Xavier-Do, David Tran, jvm-odoo, jerome hanke (jhk), Victor Feyens, Andrea Grazioso (agr-odoo), Paul Morelle, Sébastien Theys, Akim Juillerat, david, Nasreddin (bon), alt-odoo, oco-odoo, Florent de Labarre, Julien Mougenot, Jason Van Malder, fw-bot, Anh Thao Pham (pta), Adrien Horgnies, svs-odoo, Luis González, std-odoo, Rémy Baranx (bar), Achraf (abz), Lucas Lefèvre, Brice bib Bartoletti, Adrien Widart, Ivan Yelizariev, Nasreddin Boulif (bon), Touati Djamel (otd), Nicolas Galler, Swapnesh Shah, nie, Tiffany Chang (tic), IEL, Rémy Voet (ryv), Mathieu Duckerts-Antoine, Pierre Paridans, Hoang Tran, jbw, Yenthe666, tafaRU, Hiral Bhavsar, Arnaud Joset, Jinal Patel, root, Kevin Baptiste, Arnaud Baes, Xavier BOL (xbo), roen-odoo, Benoit Socias, Laurent Desausoi (lade), momegahed, jdoutreloux, Jigar Vaghela, Nicolas (vin), Florian Damhaut, Ankita Raval, yhu-odoo, thcl-odoo, Juan Jose Scarafia, mafo-odoo, jpr-odoo, william, JordiMForgeFlow, Nshimiyimana Séna, Yolann Sabaux, John Laterre (jol), Adrien Minet, Hemali Bhimani, Jinjiu Liu, Laurent Stukkens (LTU), dbkosky, Antoine Vandevenne, dht-odoo, Roy Le, nje-odoo, Pierrot (prro), niyasraphy, nda-odoo, mehjabinfarsana, Louis Wicket (wil), Maximilien (malb), Victor Piryns (pivi), Gauthier Wala (gawa), Valentin Vallaeys (vava), ノウラ, Horacio Tellez, shs-odoo, Horacio Tellez (hote), Andrea Arce
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:14:29
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - 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
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module contains all the common features of Sales Management and eCommerce.
    

Code Analysis

Views touched (65)
XML IDNameModelTypeStatus
account_invoice_form Account Invoice account.move data Inherits account.view_move_form
account_invoice_groupby_inherit account.move.groupby account.move xpath Inherits account.view_account_invoice_filter
account_invoice_view_tree account.move.tree.inherit.sale account.move field Inherits account.view_invoice_tree
acquirer_form_inherit_sale payment.acquirer.form.inherit.sale.payment payment.acquirer xpath Inherits payment.acquirer_form
assets_backend_inherit_sale Sale backend assets ir.ui.view qweb Inherits web.assets_backend
assets_frontend_inherit_sale Sale frontend assets ir.ui.view qweb Inherits web.assets_frontend
assets_tests Sale Assets Tests ir.ui.view qweb Inherits web.assets_tests
crm_lead_partner_kanban_view res.partner.kanban.saleorder.inherit res.partner field Inherits base.res_partner_kanban_view
crm_team_salesteams_view_form crm.team.form crm.team xpath Inherits sales_team.crm_team_view_form
crm_team_salesteams_view_kanban crm.team.kanban crm.team data Inherits sales_team.crm_team_salesteams_view_kanban
mail_notification_paynow_online Quotation: Sign and Pay mail notification template ir.ui.view qweb Inherits mail.mail_notification_paynow
onboarding_quotation_layout_step onboarding_quotation_layout_step ir.ui.view qweb New
portal_my_home_menu_sale Portal layout : sales menu entries ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home_sale Show Quotations / Sales Orders ir.ui.view qweb Inherits portal.portal_my_home
portal_my_orders My Sales Orders ir.ui.view qweb New
portal_my_quotations My Quotations ir.ui.view qweb New
product_form_view_sale_order_button product.product.sale.order product.product div Inherits product.product_normal_form_view
product_template_form_view product.template.product.website.form product.template xpath Inherits product.product_template_form_view
product_template_form_view_invoice_policy product.template.invoice.policy product.template xpath Inherits product.product_template_form_view
product_template_form_view_sale_order_button product.template.sale.order.button product.template div Inherits product.product_template_only_form_view
product_template_sale_form_view product.template.sales product.template xpath Inherits product.product_template_form_view
qunit_suite sale_tests ir.ui.view qweb Inherits web.qunit_suite_tests
report_assets_common_inherit_sale Sale report common assets ir.ui.view qweb Inherits web.report_assets_common
report_invoice_document_inherit_sale report_invoice_document_inherit_sale ir.ui.view qweb Inherits account.report_invoice_document
report_saleorder report_saleorder ir.ui.view qweb New
report_saleorder_document report_saleorder_document ir.ui.view qweb New
report_saleorder_pro_forma report_saleorder_pro_forma ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.sale res.config.settings xpath Inherits base.res_config_settings_view_form
res_partner_view_buttons res.partner.view.buttons res.partner div Inherits base.view_partner_form
res_partner_view_form_payment_defaultcreditcard res.partner.view.form.payment.defaultcreditcard res.partner button Inherits payment.view_partners_form_payment_defaultcreditcard
res_partner_view_form_property_inherit res.partner.view.form.property.inherit res.partner group Inherits account.view_partner_property_form
sale_onboarding_order_confirmation_form sale.order.confirmation.onboarding.form sale.payment.acquirer.onboarding.wizard xpath Inherits payment.payment_acquirer_onboarding_wizard_form
sale_onboarding_order_confirmation_step sale_onboarding_order_confirmation_step ir.ui.view qweb New
sale_onboarding_sample_quotation_step sale_onboarding_sample_quotation_step ir.ui.view qweb New
sale_order_cancel_view_form sale.order.cancel.form sale.order.cancel form New
sale_order_line_view_form_readonly sale.order.line.form.readonly sale.order.line form New
sale_order_line_view_kanban sale.order.line.kanban sale.order.line kanban New
sale_order_portal_content Sales Order Portal Content ir.ui.view qweb New
sale_order_portal_content_totals_table sale_order_portal_content_totals_table ir.ui.view qweb New
sale_order_portal_template Sales Order Portal Template ir.ui.view qweb Inherits portal.portal_sidebar
sale_order_view_activity sale.order.activity sale.order activity New
sale_order_view_search_inherit_quotation sale.order.search.inherit.quotation sale.order xpath Inherits sale.view_sales_order_filter
sale_order_view_search_inherit_sale sale.order.search.inherit.sale sale.order xpath Inherits sale.view_sales_order_filter
sale_quotation_onboarding_panel sale.quotation.onboarding.panel ir.ui.view qweb New
transaction_form_inherit_sale payment.transaction.form.inherit.sale.payment payment.transaction xpath Inherits payment.transaction_form
utm_campaign_view_form utm.campaign.view.form utm.campaign xpath Inherits utm.utm_campaign_view_form
utm_campaign_view_kanban utm.campaign.view.kanban utm.campaign xpath Inherits utm.utm_campaign_view_kanban
variants variants ir.ui.view qweb New
view_account_invoice_report_search_inherit account.invoice.report.search.inherit account.invoice.report xpath Inherits account.view_account_invoice_report_search
view_order_form sale.order.form sale.order form New
view_order_line_tree sale.order.line.tree sale.order.line tree New
view_order_product_graph sale.report.graph sale.report graph New
view_order_product_pivot sale.report.pivot sale.report pivot New
view_order_product_search sale.report.search sale.report search New
view_order_tree sale.order.tree sale.order tree New
view_quotation_tree sale.order.tree sale.order tree New
view_quotation_tree_with_onboarding sale.order.tree sale.order xpath Inherits view_quotation_tree
view_sale_advance_payment_inv Invoice Orders sale.advance.payment.inv form New
view_sale_order_calendar sale.order.calendar sale.order calendar New
view_sale_order_graph sale.order.graph sale.order graph New
view_sale_order_kanban sale.order.kanban sale.order kanban New
view_sale_order_pivot sale.order.pivot sale.order pivot New
view_sales_order_auto_done_setting sale.order.form sale.order xpath Inherits sale.view_order_form
view_sales_order_filter sale.order.list.select sale.order search New
view_sales_order_line_filter sale.order.line.select sale.order.line search New
Models touched (26)

New fields (1)
  • so_line Many2one → sale.order.line
    domain=<expr> string='Sales Order Item' args: 'sale.order.line'
Public methods (0)

No public methods.

New fields (1)
  • team_id Many2one → crm.team
    string='Sales Team' args: 'crm.team'
Public methods (0)

No public methods.

New fields (2)
  • partner_shipping_id Many2one → res.partner
    domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Delivery address for current invoice.' readonly=True states={'draft': [('readonly', False)]} string='Delivery Address' args: 'res.partner'
  • team_id Many2one → crm.team
    default=_get_invoice_default_sale_team domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" string='Sales Team' args: 'crm.team'
Public methods (3)
  • action_invoice_paid(self)
  • onchange_user_id(self)
    @api.onchange('invoice_user_id')
  • unlink(self)

New fields (0)

No new fields.

Public methods (1)
  • action_post(self)

New fields (1)
  • sale_line_ids Many2many → sale.order.line
    copy=False readonly=True string='Sales Order Lines' args: 'sale.order.line', 'sale_order_line_invoice_rel', 'invoice_line_id', 'order_line_id'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (6)
  • invoiced Float
    compute='_compute_invoiced' help='Invoice revenue for the current month. This is the amount the sales channel has invoiced this month. It is used to compute the progression ratio of the current and target revenue on the kanban view.' readonly=True string='Invoiced This Month'
  • invoiced_target Float
    help='Revenue target for the current month (untaxed total of confirmed invoices).' string='Invoicing Target'
  • quotations_amount Float
    compute='_compute_quotations_to_invoice' readonly=True string='Amount of quotations to invoice'
  • quotations_count Integer
    compute='_compute_quotations_to_invoice' readonly=True string='Number of quotations to invoice'
  • sales_to_invoice_count Integer
    compute='_compute_sales_to_invoice' readonly=True string='Number of sales to invoice'
  • use_quotations Boolean
    help='Check this box if you send quotations to your customers rather than confirming orders straight away.' string='Quotations'
Public methods (2)
  • action_primary_channel_button(self)
  • update_invoiced_target(self, value)

New fields (0)

No new fields.

Public methods (1)
  • send_mail(self, auto_commit=False)

New fields (1)
  • so_reference_type Selection
    default='so_name' help='You can set here the communication type that will appear on sales orders.The communication will be given to the customer when they choose the payment method.' selection=[('so_name', 'Based on Document Reference'), ('partner', 'Based on Customer ID')] string='Communication'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • default_get(self, fields)
    @api.model

New fields (2)
  • sale_order_ids Many2many → sale.order
    copy=False readonly=True string='Sales Orders' args: 'sale.order', 'sale_order_transaction_rel', 'transaction_id', 'sale_order_id'
  • sale_order_ids_nbr Integer
    compute='_compute_sale_order_ids_nbr' string='# of Sales Orders'
Public methods (2)
  • action_view_sales_orders(self)
  • render_sale_button(self, order, submit_txt=None, render_values=None)

New fields (1)
  • sale_order_line_id Many2one → sale.order.line
    ondelete='cascade' required=True string='Sales Order Line' args: 'sale.order.line'
Public methods (0)

No public methods.

New fields (1)
  • sales_count Float
    compute='_compute_sales_count' string='Sold'
Public methods (1)
  • action_view_sales(self)

New fields (8)
  • expense_policy Selection
    default='no' help='Expenses and vendor bills can be re-invoiced to a customer.With this option, a validated expense can be re-invoice to a customer at its cost or sales price.' string='Re-Invoice Expenses' args: [('no', 'No'), ('cost', 'At cost'), ('sales_price', 'Sales price')]
  • invoice_policy Selection
    default='order' help='Ordered Quantity: Invoice quantities ordered by the customer.\nDelivered Quantity: Invoice quantities delivered to the customer.' string='Invoicing Policy' args: [('order', 'Ordered quantities'), ('delivery', 'Delivered quantities')]
  • sale_line_warn Selection
    default='no-message' help=WARNING_HELP required=True args: WARNING_MESSAGE, 'Sales Order Line'
  • sale_line_warn_msg Text
    args: 'Message for Sales Order Line'
  • sales_count Float
    compute='_compute_sales_count' string='Sold'
  • service_type Selection
    default='manual' help='Manually set quantities on order: Invoice based on the manually entered quantity, without creating an analytic account.\nTimesheets on contract: Invoice based on the tracked hours on the related timesheet.\nCreate a task and track hours: Create a task on the sales order validation and track the work hours.' string='Track Service' args: [('manual', 'Manually set quantities on order')]
  • visible_expense_policy Boolean
    compute='_compute_visible_expense_policy' default=<expr> args: 'Re-Invoice Policy visible'
  • visible_qty_configurator Boolean
    compute='_compute_visible_qty_configurator' args: 'Quantity visible in configurator'
Public methods (3)
  • action_view_sales(self)
  • create_product_variant(self, product_template_attribute_value_ids)
    Create if necessary and possible and return the id of the product variant matching the given combination for this template. Note AWA: Known "exploit" issues with this method: - This method could be used by an unauthenticated user to generate a lot of useless variants. Unfortunately, after discussing the matter with ODO, there's no easy and user-friendly way to block that behavior. We would have to use captcha/server actions to clean/... that are all not user-friendly/overkill mechanisms. - This method could be used to try to guess what product variant ids are created in the system and what product template ids are configured as "dynamic", but that does not seem like a big deal. The error messages are identical on purpose to avoid giving too much information to a potential attacker: - returning 0 when failing - returning the variant id whether it already existed or not :param product_template_attribute_value_ids: the combination for which to get or create variant :type product_template_attribute_value_ids: json encoded list of id of `product.template.attribute.value` :return: id of the product variant matching the combination or 0 :rtype: int
  • get_import_templates(self)
    @api.model

New fields (15)
  • analytic_account_id Many2one → account.analytic.account
    readonly=True args: 'account.analytic.account', 'Analytic Account'
  • categ_id Many2one → product.category
    readonly=True args: 'product.category', 'Product Category'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Partner Country'
  • date_order Datetime
    readonly=True string='Date Order'
  • name Char
    readonly=True args: 'Order Reference'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Partner'
  • price_subtotal Float
    readonly=True string='Price Subtotal'
  • price_total Float
    readonly=True args: 'Total'
  • pricelist_id Many2one → product.pricelist
    readonly=True args: 'product.pricelist', 'Pricelist'
  • product_id Many2one → product.product
    readonly=True string='Product' args: 'product.product'
  • product_qty Float
    readonly=True args: 'Product Quantity'
  • product_tmpl_id Many2one → product.template
    readonly=True args: 'product.template', 'Product Template'
  • team_id Many2one → crm.team
    readonly=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    readonly=True args: 'res.users', 'Salesperson'
Public methods (1)
  • init(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (7)
  • portal_confirmation_pay Boolean
    string='Online Payment'
  • portal_confirmation_sign Boolean
    default=True string='Online Signature'
  • quotation_validity_days Integer
    default=30 string='Default Quotation Validity (Days)'
  • sale_onboarding_order_confirmation_state Selection
    default='not_done' string='State of the onboarding confirmation order step' args: [('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done')]
  • sale_onboarding_payment_method Selection
    string='Sale onboarding selected payment method' args: [('digital_signature', 'Sign online'), ('paypal', 'PayPal'), ('stripe', 'Stripe'), ('other', 'Pay with another payment acquirer'), ('manual', 'Manual Payment')]
  • sale_onboarding_sample_quotation_state Selection
    default='not_done' string='State of the onboarding sample quotation step' args: [('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done')]
  • sale_quotation_onboarding_state Selection
    default='not_done' string='State of the sale onboarding panel' args: [('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')]
Public methods (4)
  • action_close_sale_quotation_onboarding(self)
    @api.model
    Mark the onboarding panel as closed.
  • action_open_sale_onboarding_payment_acquirer(self)
    @api.model
    Called by onboarding panel above the quotation list.
  • action_open_sale_onboarding_sample_quotation(self)
    @api.model
    Onboarding step for sending a sample quotation. Open a window to compose an email, with the edi_invoice_template message loaded by default.
  • get_and_update_sale_quotation_onboarding_state(self)
    This method is called on the controller rendering method and ensures that the animations are displayed only one time.

New fields (25)
  • auth_signup_uninvited Selection
    config_parameter='auth_signup.invitation_scope' default='b2b' string='Customer Account' args: [('b2b', 'On invitation'), ('b2c', 'Free sign up')]
  • automatic_invoice Boolean
    config_parameter='sale.automatic_invoice' help='The invoice is generated automatically and available in the customer portal when the transaction is confirmed by the payment acquirer.\nThe invoice is marked as paid and the payment is registered in the payment journal defined in the configuration of the payment acquirer.\nThis mode is advised if you issue the final invoice at the order and not after the delivery.' args: 'Automatic Invoice'
  • confirmation_template_id Many2one → mail.template
    config_parameter='sale.default_confirmation_template' domain="[('model', '=', 'sale.order')]" help='Email sent to the customer once the order is paid.' string='Confirmation Email' args: 'mail.template'
  • default_invoice_policy Selection
    default='delivery' default_model='product.template' args: [('order', 'Invoice what is ordered'), ('delivery', 'Invoice what is delivered')], 'Invoicing Policy'
  • deposit_default_product_id Many2one → product.product
    config_parameter='sale.default_deposit_product_id' domain="[('type', '=', 'service')]" help='Default product used for payment advances' args: 'product.product', 'Deposit Product'
  • group_auto_done_setting Boolean
    implied_group='sale.group_auto_done_setting' args: 'Lock Confirmed Sales'
  • group_proforma_sales Boolean
    help='Allows you to send pro-forma invoice.' implied_group='sale.group_proforma_sales' string='Pro-Forma Invoice'
  • group_sale_delivery_address Boolean
    implied_group='sale.group_delivery_invoice_address' args: 'Customer Addresses'
  • group_warning_sale Boolean
    implied_group='sale.group_warning_sale' args: 'Sale Order Warnings'
  • module_delivery Boolean
    args: 'Delivery Methods'
  • module_delivery_bpost Boolean
    args: 'bpost Connector'
  • module_delivery_dhl Boolean
    args: 'DHL Express Connector'
  • module_delivery_easypost Boolean
    args: 'Easypost Connector'
  • module_delivery_fedex Boolean
    args: 'FedEx Connector'
  • module_delivery_ups Boolean
    args: 'UPS Connector'
  • module_delivery_usps Boolean
    args: 'USPS Connector'
  • module_product_email_template Boolean
    args: 'Specific Email'
  • module_sale_amazon Boolean
    args: 'Amazon Sync'
  • module_sale_coupon Boolean
    args: 'Coupons & Promotions'
  • module_sale_margin Boolean
    args: 'Margins'
  • portal_confirmation_pay Boolean
    readonly=False related='company_id.portal_confirmation_pay' string='Online Payment'
  • portal_confirmation_sign Boolean
    readonly=False related='company_id.portal_confirmation_sign' string='Online Signature'
  • quotation_validity_days Integer
    readonly=False related='company_id.quotation_validity_days' string='Default Quotation Validity (Days)'
  • template_id Many2one → mail.template
    config_parameter='sale.default_email_template' default=<expr> domain="[('model', '=', 'account.move')]" args: 'mail.template', 'Email Template'
  • use_quotation_validity_days Boolean
    config_parameter='sale.use_quotation_validity_days' args: 'Default Quotation Validity'
Public methods (1)
  • set_values(self)

New fields (4)
  • sale_order_count Integer
    compute='_compute_sale_order_count' string='Sale Order Count'
  • sale_order_ids One2many → sale.order
    args: 'sale.order', 'partner_id', 'Sales Order'
  • sale_warn Selection
    default='no-message' help=WARNING_HELP args: WARNING_MESSAGE, 'Sales Warnings'
  • sale_warn_msg Text
    args: 'Message for Sales Order'
Public methods (2)
  • action_view_sale_order(self)
  • can_edit_vat(self)
    Can't edit `vat` if there is (non draft) issued SO.

New fields (10)
  • advance_payment_method Selection
    default='delivered' help='A standard invoice is issued with all the order lines ready for invoicing, according to their invoicing policy (based on ordered or delivered quantity).' required=True string='Create Invoice' args: [('delivered', 'Regular invoice'), ('percentage', 'Down payment (percentage)'), ('fixed', 'Down payment (fixed amount)')]
  • amount Float
    digits='Account' help='The percentage of amount to be invoiced in advance, taxes excluded.' args: 'Down Payment Amount'
  • count Integer
    default=_count string='Order Count'
  • currency_id Many2one → res.currency
    default=_default_currency_id string='Currency' args: 'res.currency'
  • deduct_down_payments Boolean
    default=True args: 'Deduct down payments'
  • deposit_account_id Many2one → account.account
    default=_default_deposit_account_id domain=[('deprecated', '=', False)] help='Account used for deposits' string='Income Account' args: 'account.account'
  • deposit_taxes_id Many2many → account.tax
    default=_default_deposit_taxes_id help='Taxes used for deposits' string='Customer Taxes' args: 'account.tax'
  • fixed_amount Monetary
    help='The fixed amount to be invoiced in advance, taxes excluded.' args: 'Down Payment Amount (Fixed)'
  • has_down_payments Boolean
    default=_default_has_down_payment readonly=True args: 'Has down payments'
  • product_id Many2one → product.product
    default=_default_product_id domain=[('type', '=', 'service')] string='Down Payment Product' args: 'product.product'
Public methods (2)
  • create_invoices(self)
  • onchange_advance_payment_method(self)
    @api.onchange('advance_payment_method')

New fields (43)
  • amount_by_group Binary
    compute='_amount_by_group' help='type: [(name, amount, base, formated amount, formated base)]' string='Tax amount by group'
  • amount_tax Monetary
    compute='_amount_all' readonly=True store=True string='Taxes'
  • amount_total Monetary
    compute='_amount_all' readonly=True store=True string='Total' tracking=4
  • amount_undiscounted Float
    compute='_compute_amount_undiscounted' digits=0 args: 'Amount Before Discount'
  • amount_untaxed Monetary
    compute='_amount_all' readonly=True store=True string='Untaxed Amount' tracking=5
  • analytic_account_id Many2one → account.analytic.account
    check_company=True compute='_compute_analytic_account_id' copy=False domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='The analytic account related to a sales order.' readonly=False states={'sale': [('readonly', True)], 'done': [('readonly', True)], 'cancel': [('readonly', True)]} store=True args: 'account.analytic.account', 'Analytic Account'
  • authorized_transaction_ids Many2many → payment.transaction
    compute='_compute_authorized_transaction_ids' copy=False readonly=True string='Authorized Transactions' args: 'payment.transaction'
  • client_order_ref Char
    copy=False string='Customer Reference'
  • commitment_date Datetime
    copy=False help='This is the delivery date promised to the customer. If set, the delivery order will be scheduled based on this date rather than product lead times.' states={'done': [('readonly', True)], 'cancel': [('readonly', True)]} args: 'Delivery Date'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • create_date Datetime
    help='Date on which sales order is created.' index=True readonly=True string='Creation Date'
  • currency_id Many2one
    depends=['pricelist_id'] related='pricelist_id.currency_id' store=True
  • currency_rate Float
    compute='_compute_currency_rate' compute_sudo=True digits=(12, 6) help='The rate of the currency to the currency of rate 1 applicable at the date of the order' readonly=True store=True args: 'Currency Rate'
  • date_order Datetime
    copy=False default=fields.Datetime.now help='Creation date of draft/sent orders,\nConfirmation date of confirmed orders.' index=True readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Order Date'
  • expected_date Datetime
    compute='_compute_expected_date' help='Delivery date you can promise to the customer, computed from the minimum lead time of the order lines.' store=False args: 'Expected Date'
  • fiscal_position_id Many2one → account.fiscal.position
    check_company=True domain="[('company_id', '=', company_id)]" help='Fiscal positions are used to adapt taxes and accounts for particular customers or sales orders/invoices.The default value comes from the customer.' string='Fiscal Position' args: 'account.fiscal.position'
  • invoice_count Integer
    compute='_get_invoiced' readonly=True string='Invoice Count'
  • invoice_ids Many2many → account.move
    compute='_get_invoiced' copy=False readonly=True search='_search_invoice_ids' string='Invoices' args: 'account.move'
  • invoice_status Selection
    compute='_get_invoice_status' readonly=True store=True string='Invoice Status' args: [('upselling', 'Upselling Opportunity'), ('invoiced', 'Fully Invoiced'), ('to invoice', 'To Invoice'), ('no', 'Nothing to Invoice')]
  • is_expired Boolean
    compute='_compute_is_expired' string='Is expired'
  • name Char
    copy=False default=<expr> index=True readonly=True required=True states={'draft': [('readonly', False)]} string='Order Reference'
  • note Text
    default=_default_note args: 'Terms and conditions'
  • order_line One2many → sale.order.line
    auto_join=True copy=True states={'cancel': [('readonly', True)], 'done': [('readonly', True)]} string='Order Lines' args: 'sale.order.line', 'order_id'
  • origin Char
    help='Reference of the document that generated this sales order request.' string='Source Document'
  • partner_id Many2one → res.partner
    change_default=True domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" index=True readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Customer' tracking=1 args: 'res.partner'
  • partner_invoice_id Many2one → res.partner
    domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)], 'sale': [('readonly', False)]} string='Invoice Address' args: 'res.partner'
  • partner_shipping_id Many2one → res.partner
    domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)], 'sale': [('readonly', False)]} string='Delivery Address' args: 'res.partner'
  • payment_term_id Many2one → account.payment.term
    check_company=True domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" string='Payment Terms' args: 'account.payment.term'
  • pricelist_id Many2one → product.pricelist
    check_company=True domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='If you change the pricelist, only newly added lines will be affected.' readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Pricelist' tracking=1 args: 'product.pricelist'
  • reference Char
    copy=False help='The payment communication of this sale order.' string='Payment Ref.'
  • require_payment Boolean
    default=_get_default_require_payment help='Request an online payment to the customer in order to confirm orders automatically.' readonly=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} args: 'Online Payment'
  • require_signature Boolean
    default=_get_default_require_signature help='Request a online signature to the customer in order to confirm orders automatically.' readonly=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} args: 'Online Signature'
  • show_update_pricelist Boolean
    help='Technical Field, True if the pricelist was changed;\n this will then display a recomputation button' string='Has Pricelist Changed'
  • signature Image
    attachment=True copy=False help='Signature received through the portal.' max_height=1024 max_width=1024 args: 'Signature'
  • signed_by Char
    copy=False help='Name of the person that signed the SO.' args: 'Signed By'
  • signed_on Datetime
    copy=False help='Date of the signature.' args: 'Signed On'
  • state Selection
    copy=False default='draft' index=True readonly=True string='Status' tracking=3 args: [('draft', 'Quotation'), ('sent', 'Quotation Sent'), ('sale', 'Sales Order'), ('done', 'Locked'), ('cancel', 'Cancelled')]
  • tag_ids Many2many → crm.tag
    string='Tags' args: 'crm.tag', 'sale_order_tag_rel', 'order_id', 'tag_id'
  • team_id Many2one → crm.team
    change_default=True check_company=True default=_get_default_team domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" args: 'crm.team', 'Sales Team'
  • transaction_ids Many2many → payment.transaction
    copy=False readonly=True string='Transactions' args: 'payment.transaction', 'sale_order_transaction_rel', 'sale_order_id', 'transaction_id'
  • type_name Char
    compute='_compute_type_name' args: 'Type Name'
  • user_id Many2one → res.users
    default=<expr> domain=<expr> index=True string='Salesperson' tracking=2 args: 'res.users'
  • validity_date Date
    copy=False default=_default_validity_date readonly=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Expiration'
Public methods (27)
  • action_cancel(self)
  • action_confirm(self)
  • action_done(self)
  • action_draft(self)
  • action_quotation_send(self)
    Opens a wizard to compose an email, with relevant mail template loaded by default
  • action_quotation_sent(self)
  • action_unlock(self)
  • action_view_invoice(self)
  • add_option_to_order_with_taxcloud(self)
  • copy_data(self, default=None)
  • create(self, vals)
    @api.model
  • get_empty_list_help(self, help)
    @api.model
  • get_portal_last_transaction(self)
  • has_to_be_paid(self, include_draft=False)
  • has_to_be_signed(self, include_draft=False)
  • message_post(self, **kwargs)
    @api.returns('mail.message', <expr>)
  • name_get(self)
  • onchange_partner_id(self)
    @api.onchange('partner_id')
    Update the following fields when the partner is changed: - Pricelist - Payment terms - Invoice address - Delivery address - Sales Team
  • onchange_partner_id_warning(self)
    @api.onchange('partner_id')
  • onchange_partner_shipping_id(self)
    @api.onchange('partner_shipping_id', 'partner_id', 'company_id')
    Trigger the change of fiscal position when the shipping address is modified.
  • onchange_user_id(self)
    @api.onchange('user_id')
  • payment_action_capture(self)
  • payment_action_void(self)
  • preview_sale_order(self)
  • unlink(self)
  • update_prices(self)
  • validate_taxes_on_sales_order(self)

New fields (2)
  • display_invoice_alert Boolean
    compute='_compute_display_invoice_alert' args: 'Invoice Alert'
  • order_id Many2one → sale.order
    ondelete='cascade' required=True string='Sale Order' args: 'sale.order'
Public methods (1)
  • action_cancel(self)

New fields (41)
  • analytic_line_ids One2many → account.analytic.line
    string='Analytic lines' args: 'account.analytic.line', 'so_line'
  • analytic_tag_ids Many2many → account.analytic.tag
    compute='_compute_analytic_tag_ids' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" readonly=False store=True string='Analytic Tags' args: 'account.analytic.tag'
  • company_id Many2one
    index=True readonly=True related='order_id.company_id' store=True string='Company'
  • currency_id Many2one
    depends=['order_id.currency_id'] readonly=True related='order_id.currency_id' store=True string='Currency'
  • customer_lead Float
    default=0.0 help='Number of days between the order confirmation and the shipping of the products to the customer' required=True args: 'Lead Time'
  • discount Float
    default=0.0 digits='Discount' string='Discount (%)'
  • display_type Selection
    default=False help='Technical field for UX purpose.' args: [('line_section', 'Section'), ('line_note', 'Note')]
  • invoice_lines Many2many → account.move.line
    copy=False string='Invoice Lines' args: 'account.move.line', 'sale_order_line_invoice_rel', 'order_line_id', 'invoice_line_id'
  • invoice_status Selection
    compute='_compute_invoice_status' default='no' readonly=True store=True string='Invoice Status' args: [('upselling', 'Upselling Opportunity'), ('invoiced', 'Fully Invoiced'), ('to invoice', 'To Invoice'), ('no', 'Nothing to Invoice')]
  • is_downpayment Boolean
    help='Down payments are made when creating invoices from a sales order. They are not copied when duplicating a sales order.' string='Is a down payment'
  • is_expense Boolean
    help='Is true if the sales order line comes from an expense or a vendor bills' args: 'Is expense'
  • name Text
    required=True string='Description'
  • order_id Many2one → sale.order
    copy=False index=True ondelete='cascade' required=True string='Order Reference' args: 'sale.order'
  • order_partner_id Many2one
    readonly=False related='order_id.partner_id' store=True string='Customer'
  • price_reduce Float
    compute='_get_price_reduce' digits='Product Price' readonly=True store=True string='Price Reduce'
  • price_reduce_taxexcl Monetary
    compute='_get_price_reduce_notax' readonly=True store=True string='Price Reduce Tax excl'
  • price_reduce_taxinc Monetary
    compute='_get_price_reduce_tax' readonly=True store=True string='Price Reduce Tax inc'
  • price_subtotal Monetary
    compute='_compute_amount' readonly=True store=True string='Subtotal'
  • price_tax Float
    compute='_compute_amount' readonly=True store=True string='Total Tax'
  • price_total Monetary
    compute='_compute_amount' readonly=True store=True string='Total'
  • price_unit Float
    default=0.0 digits='Product Price' required=True args: 'Unit Price'
  • product_custom_attribute_value_ids One2many → product.attribute.custom.value
    copy=True string='Custom Values' args: 'product.attribute.custom.value', 'sale_order_line_id'
  • product_id Many2one → product.product
    change_default=True check_company=True domain="[('sale_ok', '=', True), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" ondelete='restrict' string='Product' args: 'product.product'
  • product_no_variant_attribute_value_ids Many2many → product.template.attribute.value
    ondelete='restrict' string='Extra Values' args: 'product.template.attribute.value'
  • product_template_id Many2one → product.template
    domain=[('sale_ok', '=', True)] related='product_id.product_tmpl_id' string='Product Template' args: 'product.template'
  • product_uom Many2one → uom.uom
    domain="[('category_id', '=', product_uom_category_id)]" string='Unit of Measure' args: 'uom.uom'
  • product_uom_category_id Many2one
    readonly=True related='product_id.uom_id.category_id'
  • product_uom_qty Float
    default=1.0 digits='Product Unit of Measure' required=True string='Quantity'
  • product_uom_readonly Boolean
    compute='_compute_product_uom_readonly'
  • product_updatable Boolean
    compute='_compute_product_updatable' default=True readonly=True string='Can Edit Product'
  • qty_delivered Float
    compute='_compute_qty_delivered' compute_sudo=True copy=False default=0.0 digits='Product Unit of Measure' inverse='_inverse_qty_delivered' store=True args: 'Delivered Quantity'
  • qty_delivered_manual Float
    copy=False default=0.0 digits='Product Unit of Measure' args: 'Delivered Manually'
  • qty_delivered_method Selection
    compute='_compute_qty_delivered_method' compute_sudo=True help='According to product configuration, the delivered quantity can be automatically computed by mechanism :\n - Manual: the quantity is set manually on the line\n - Analytic From expenses: the quantity is the quantity sum from posted expenses\n - Timesheet: the quantity is the sum of hours recorded on tasks linked to this sale line\n - Stock Moves: the quantity comes from confirmed pickings\n' readonly=True store=True string='Method to update delivered qty' args: [('manual', 'Manual'), ('analytic', 'Analytic From Expenses')]
  • qty_invoiced Float
    compute='_get_invoice_qty' compute_sudo=True digits='Product Unit of Measure' readonly=True store=True string='Invoiced Quantity'
  • qty_to_invoice Float
    compute='_get_to_invoice_qty' digits='Product Unit of Measure' readonly=True store=True string='To Invoice Quantity'
  • salesman_id Many2one
    readonly=True related='order_id.user_id' store=True string='Salesperson'
  • sequence Integer
    default=10 string='Sequence'
  • state Selection
    copy=False default='draft' readonly=True related='order_id.state' store=True string='Order Status'
  • tax_id Many2many → account.tax
    context={'active_test': False} string='Taxes' args: 'account.tax'
  • untaxed_amount_invoiced Monetary
    compute='_compute_untaxed_amount_invoiced' compute_sudo=True store=True args: 'Untaxed Invoiced Amount'
  • untaxed_amount_to_invoice Monetary
    compute='_compute_untaxed_amount_to_invoice' compute_sudo=True store=True args: 'Untaxed Amount To Invoice'
Public methods (7)
  • create(self, vals_list)
    @api.model_create_multi
  • get_sale_order_line_multiline_description_sale(self, product)
    Compute a default multiline description for this sales order line. In most cases the product description is enough but sometimes we need to append information that only exists on the sale order line itself. e.g: - custom attributes and attributes that don't create variants, both introduced by the "product configurator" - in event_sale we need to know specifically the sales order line as well as the product to generate the name: the product is not sufficient because we also need to know the event_id and the event_ticket_id (both which belong to the sale order line).
  • name_get(self)
  • product_id_change(self)
    @api.onchange('product_id')
  • product_uom_change(self)
    @api.onchange('product_uom', 'product_uom_qty')
  • unlink(self)
  • write(self, values)

New fields (1)
  • payment_method Selection
    default=_get_default_payment_method selection_add=[('digital_signature', 'Electronic signature'), ('paypal', 'PayPal'), ('stripe', 'Credit card (via Stripe)'), ('other', 'Other payment acquirer'), ('manual', 'Custom payment instructions')]
Public methods (1)
  • add_payment_methods(self, *args, **kwargs)

New fields (33)
  • analytic_account_id Many2one → account.analytic.account
    readonly=True args: 'account.analytic.account', 'Analytic Account'
  • campaign_id Many2one → utm.campaign
    args: 'utm.campaign', 'Campaign'
  • categ_id Many2one → product.category
    readonly=True args: 'product.category', 'Product Category'
  • commercial_partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Customer Entity'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Customer Country'
  • date Datetime
    readonly=True args: 'Order Date'
  • discount Float
    readonly=True args: 'Discount %'
  • discount_amount Float
    readonly=True args: 'Discount Amount'
  • industry_id Many2one → res.partner.industry
    readonly=True args: 'res.partner.industry', 'Customer Industry'
  • medium_id Many2one → utm.medium
    args: 'utm.medium', 'Medium'
  • name Char
    readonly=True args: 'Order Reference'
  • nbr Integer
    readonly=True args: '# of Lines'
  • order_id Many2one → sale.order
    readonly=True args: 'sale.order', 'Order #'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Customer'
  • price_subtotal Float
    readonly=True args: 'Untaxed Total'
  • price_total Float
    readonly=True args: 'Total'
  • pricelist_id Many2one → product.pricelist
    readonly=True args: 'product.pricelist', 'Pricelist'
  • product_id Many2one → product.product
    readonly=True args: 'product.product', 'Product Variant'
  • product_tmpl_id Many2one → product.template
    readonly=True args: 'product.template', 'Product'
  • product_uom Many2one → uom.uom
    readonly=True args: 'uom.uom', 'Unit of Measure'
  • product_uom_qty Float
    readonly=True args: 'Qty Ordered'
  • qty_delivered Float
    readonly=True args: 'Qty Delivered'
  • qty_invoiced Float
    readonly=True args: 'Qty Invoiced'
  • qty_to_invoice Float
    readonly=True args: 'Qty To Invoice'
  • source_id Many2one → utm.source
    args: 'utm.source', 'Source'
  • state Selection
    readonly=True string='Status' args: [('draft', 'Draft Quotation'), ('sent', 'Quotation Sent'), ('sale', 'Sales Order'), ('done', 'Sales Done'), ('cancel', 'Cancelled')]
  • team_id Many2one → crm.team
    readonly=True args: 'crm.team', 'Sales Team'
  • untaxed_amount_invoiced Float
    readonly=True args: 'Untaxed Amount Invoiced'
  • untaxed_amount_to_invoice Float
    readonly=True args: 'Untaxed Amount To Invoice'
  • user_id Many2one → res.users
    readonly=True args: 'res.users', 'Salesperson'
  • volume Float
    readonly=True args: 'Volume'
  • weight Float
    readonly=True args: 'Gross Weight'
Public methods (1)
  • init(self)

New fields (4)
  • company_id Many2one → res.company
    default=<expr> readonly=True states={'draft': [('readonly', False)], 'refused': [('readonly', False)]} string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    related='company_id.currency_id' string='Currency' args: 'res.currency'
  • invoiced_amount Integer
    compute='_compute_sale_invoiced_amount' default=0 string='Revenues generated by the campaign'
  • quotation_count Integer
    compute='_compute_quotation_count' groups='sales_team.group_sale_salesman' args: 'Quotation Count'
Public methods (2)
  • action_redirect_to_invoiced(self)
  • action_redirect_to_quotations(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/13.0/sale
VERSION
VERSION 1.1
CATEGORY
CATEGORYSales/Sales
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Christophe Matthieu, Martin Trigaux, Olivier Dony, Thibault Delavallée, Denis Ledoux, Christophe Simonis, David Monjoie, Xavier Morel, Goffin Simon, Mohammed Shekha, Simon Lejeune, Nicolas Martinelli, Nicolas Lempereur, Thibault Francois, qdp-odoo, Géry Debongnie, Aaron Bohy, Pedro M. Baeza, Jeremy Kersten, GitHub, Lucas Perais (lpe), Damien Bouvy, Barad Mahendra, Yannick Tivisse, qsm-odoo, Martin Geubelle, Odoo Online, Nicolas Seinlet, Pierre Masereel, Romain Derie, Laurent Smet, Jigar Patel, jem-odoo, Adrien Dieudonne, RomainLibert, Christophe Monniez, Jorge Pinna Puissant, Jairo Llopis, Nans Lefebvre, Gert Pellin, Toufik Ben Jaa, Adrian Torres, wan, Aurélien Warnon, Priyanka Kakadiya, Xavier-Do, David Tran, Rishabh Jadia, Romeo Fragomeli, jvm-odoo, jerome hanke (jhk), Victor Feyens, Andrea Grazioso (agr-odoo), Paul Morelle, William Henrotin, Sébastien Theys, Akim Juillerat, david, Nasreddin (bon), alt-odoo, Jason Van Malder, Vincent Schippefilt, fw-bot, Anh Thao Pham (pta), Adrien Horgnies, svs-odoo, Luis González, Lucas Lefèvre, Brice bib Bartoletti, Adrien Widart, Ivan Yelizariev, Nasreddin Boulif (bon), Touati Djamel (otd), Prakash Prajapati, Nicolas Galler, Swapnesh Shah, nie, IEL, Varun Raval, Yenthe666, jbm-odoo, Arnaud Joset, Hetashree Chauhan, Jinal Patel, Igor Ishchenko, Arnaud Baes, roen-odoo, qmo-odoo, asa-odoo, Geoffroy Larue, Laurent Desausoi (lade), jdoutreloux, mcm-odoo, Mitali Patel, Adrien Peiffer, Nicolas (vin), Florian Damhaut, thcl-odoo, Juan Jose Scarafia, jpr-odoo, Sapan Zaveri, JordiMForgeFlow, Nshimiyimana Séna, Juhil Somaiya, John Laterre (jol), Antoine Vandevenne (anv), Hemali Bhimani, Jinjiu Liu, Antoine Vandevenne, Valentin Chevalier, dht-odoo, Thomas Binsfeld, Roy Le
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:06:42
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - 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
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module contains all the common features of Sales Management and eCommerce.
    

Code Analysis

Views touched (69)
XML IDNameModelTypeStatus
account_invoice_form Account Invoice account.move data Inherits account.view_move_form
account_invoice_groupby_inherit account.move.groupby account.move xpath Inherits account.view_account_invoice_filter
account_invoice_view_tree account.move.tree.inherit.sale account.move field Inherits account.view_invoice_tree
acquirer_form_inherit_sale payment.acquirer.form.inherit.sale.payment payment.acquirer xpath Inherits payment.acquirer_form
assets_backend_inherit_sale Sale backend assets ir.ui.view qweb Inherits web.assets_backend
assets_frontend_inherit_sale Sale frontend assets ir.ui.view qweb Inherits web.assets_frontend
assets_tests Sale Assets Tests ir.ui.view qweb Inherits web.assets_tests
attribute_tree_view product.attribute.tree.type product.attribute field Inherits product.attribute_tree_view
crm_lead_partner_kanban_view res.partner.kanban.saleorder.inherit res.partner field Inherits base.res_partner_kanban_view
crm_team_salesteams_view_form crm.team.form crm.team xpath Inherits sales_team.crm_team_view_form
crm_team_salesteams_view_kanban crm.team.kanban crm.team data Inherits sales_team.crm_team_salesteams_view_kanban
mail_notification_paynow_online Mail: Pay Now mail notification template ir.ui.view qweb Inherits mail.mail_notification_paynow
onboarding_quotation_layout_step onboarding_quotation_layout_step ir.ui.view qweb New
portal_my_home_menu_sale Portal layout : sales menu entries ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home_sale Portal My Home : sales entries ir.ui.view qweb Inherits portal.portal_my_home
portal_my_orders My Sales Orders ir.ui.view qweb New
portal_my_quotations My Quotations ir.ui.view qweb New
product_attribute_view_form product.attribute.form.inherit product.attribute xpath Inherits product.product_attribute_view_form
product_form_view_sale_order_button product.product.sale.order product.product div Inherits product.product_normal_form_view
product_template_attribute_line_form product.template.attribute.line.form.inherit product.template.attribute.line xpath Inherits product.product_template_attribute_line_form
product_template_attribute_value_view_form_inherit product.template.attribute.value.view.form.inherit product.template.attribute.value field Inherits product.product_template_attribute_value_view_form
product_template_attribute_value_view_tree_inherit product.template.attribute.value.view.tree.inherit product.template.attribute.value field Inherits product.product_template_attribute_value_view_tree
product_template_form_view product.template.product.website.form product.template xpath Inherits product.product_template_form_view
product_template_form_view_invoice_policy product.template.invoice.policy product.template xpath Inherits product.product_template_form_view
product_template_form_view_sale_order_button product.template.sale.order.button product.template div Inherits product.product_template_only_form_view
product_template_sale_form_view product.template.sales product.template xpath Inherits product.product_template_form_view
qunit_suite sale_tests ir.ui.view qweb Inherits web.qunit_suite
report_assets_common_inherit_sale Sale report common assets ir.ui.view qweb Inherits web.report_assets_common
report_invoice_document_inherit_sale report_invoice_document_inherit_sale ir.ui.view qweb Inherits account.report_invoice_document
report_saleorder report_saleorder ir.ui.view qweb New
report_saleorder_document report_saleorder_document ir.ui.view qweb New
report_saleorder_pro_forma report_saleorder_pro_forma ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.sale res.config.settings xpath Inherits base.res_config_settings_view_form
res_partner_view_buttons res.partner.view.buttons res.partner div Inherits base.view_partner_form
res_partner_view_form_payment_defaultcreditcard res.partner.view.form.payment.defaultcreditcard res.partner button Inherits payment.view_partners_form_payment_defaultcreditcard
res_partner_view_form_property_inherit res.partner.view.form.property.inherit res.partner group Inherits account.view_partner_property_form
sale_onboarding_order_confirmation_form sale.order.confirmation.onboarding.form sale.payment.acquirer.onboarding.wizard xpath Inherits payment.payment_acquirer_onboarding_wizard_form
sale_onboarding_order_confirmation_step sale_onboarding_order_confirmation_step ir.ui.view qweb New
sale_onboarding_sample_quotation_form mail.compose.message.sale.onboarding.sample.quotation.form mail.compose.message xpath Inherits mail.email_compose_message_wizard_form
sale_onboarding_sample_quotation_step sale_onboarding_sample_quotation_step ir.ui.view qweb New
sale_order_line_view_form_readonly sale.order.line.form.readonly sale.order.line form New
sale_order_portal_content Sales Order Portal Content ir.ui.view qweb New
sale_order_portal_content_totals_table sale_order_portal_content_totals_table ir.ui.view qweb New
sale_order_portal_template Sales Order Portal Template ir.ui.view qweb Inherits portal.portal_sidebar
sale_order_view_activity sale.order.activity sale.order activity New
sale_order_view_search_inherit_quotation sale.order.search.inherit.quotation sale.order xpath Inherits sale.view_sales_order_filter
sale_order_view_search_inherit_sale sale.order.search.inherit.sale sale.order xpath Inherits sale.view_sales_order_filter
sale_quotation_onboarding_panel sale.quotation.onboarding.panel ir.ui.view qweb New
transaction_form_inherit_sale payment.transaction.form.inherit.sale.payment payment.transaction xpath Inherits payment.transaction_form
utm_campaign_view_form utm.campaign.view.form utm.campaign xpath Inherits utm.utm_campaign_view_form
utm_campaign_view_kanban utm.campaign.view.kanban utm.campaign xpath Inherits utm.utm_campaign_view_kanban
variants variants ir.ui.view qweb New
view_account_invoice_report_search_inherit account.invoice.report.search.inherit account.invoice.report xpath Inherits account.view_account_invoice_report_search
view_order_form sale.order.form sale.order form New
view_order_line_tree sale.order.line.tree sale.order.line tree New
view_order_product_graph sale.report.graph sale.report graph New
view_order_product_pivot sale.report.pivot sale.report pivot New
view_order_product_search sale.report.search sale.report search New
view_order_tree sale.order.tree sale.order tree New
view_quotation_tree sale.order.tree sale.order tree New
view_quotation_tree_with_onboarding sale.order.tree sale.order xpath Inherits view_quotation_tree
view_sale_advance_payment_inv Invoice Orders sale.advance.payment.inv form New
view_sale_order_calendar sale.order.calendar sale.order calendar New
view_sale_order_graph sale.order.graph sale.order graph New
view_sale_order_kanban sale.order.kanban sale.order kanban New
view_sale_order_pivot sale.order.pivot sale.order pivot New
view_sales_order_auto_done_setting sale.order.form sale.order xpath Inherits sale.view_order_form
view_sales_order_filter sale.order.list.select sale.order search New
view_sales_order_line_filter sale.order.line.select sale.order.line search New
Models touched (26)

New fields (1)
  • so_line Many2one → sale.order.line
    domain=<expr> string='Sales Order Item' args: 'sale.order.line'
Public methods (0)

No public methods.

New fields (1)
  • team_id Many2one → crm.team
    string='Sales Team' args: 'crm.team'
Public methods (0)

No public methods.

New fields (2)
  • partner_shipping_id Many2one → res.partner
    domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Delivery address for current invoice.' readonly=True states={'draft': [('readonly', False)]} string='Delivery Address' args: 'res.partner'
  • team_id Many2one → crm.team
    default=_get_invoice_default_sale_team domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" string='Sales Team' args: 'crm.team'
Public methods (4)
  • action_invoice_paid(self)
  • onchange_user_id(self)
    @api.onchange('invoice_user_id')
  • post(self)
  • unlink(self)

New fields (1)
  • sale_line_ids Many2many → sale.order.line
    copy=False readonly=True string='Sales Order Lines' args: 'sale.order.line', 'sale_order_line_invoice_rel', 'invoice_line_id', 'order_line_id'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • get_bank_statement_line_data(self, st_line_ids, excluded_ids=None)
    @api.model

New fields (6)
  • invoiced Integer
    compute='_compute_invoiced' help='Invoice revenue for the current month. This is the amount the sales channel has invoiced this month. It is used to compute the progression ratio of the current and target revenue on the kanban view.' readonly=True string='Invoiced This Month'
  • invoiced_target Integer
    help='Revenue target for the current month (untaxed total of confirmed invoices).' string='Invoicing Target'
  • quotations_amount Integer
    compute='_compute_quotations_to_invoice' readonly=True string='Amount of quotations to invoice'
  • quotations_count Integer
    compute='_compute_quotations_to_invoice' readonly=True string='Number of quotations to invoice'
  • sales_to_invoice_count Integer
    compute='_compute_sales_to_invoice' readonly=True string='Number of sales to invoice'
  • use_quotations Boolean
    help='Check this box if you send quotations to your customers rather than confirming orders straight away.' string='Quotations'
Public methods (2)
  • action_primary_channel_button(self)
  • update_invoiced_target(self, value)

New fields (1)
  • so_reference_type Selection
    default='so_name' help='You can set here the communication type that will appear on sales orders.The communication will be given to the customer when they choose the payment method.' selection=[('so_name', 'Based on Document Reference'), ('partner', 'Based on Customer ID')] string='Communication'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • default_get(self, fields)
    @api.model

New fields (2)
  • sale_order_ids Many2many → sale.order
    copy=False readonly=True string='Sales Orders' args: 'sale.order', 'sale_order_transaction_rel', 'transaction_id', 'sale_order_id'
  • sale_order_ids_nbr Integer
    compute='_compute_sale_order_ids_nbr' string='# of Sales Orders'
Public methods (2)
  • action_view_sales_orders(self)
  • render_sale_button(self, order, submit_txt=None, render_values=None)

New fields (1)
  • display_type Selection
    default='radio' help='The display type used in the Product Configurator.' required=True args: [('radio', 'Radio'), ('select', 'Select'), ('color', 'Color')]
Public methods (0)

No public methods.

New fields (4)
  • custom_product_template_attribute_value_id Many2one → product.template.attribute.value
    ondelete='restrict' required=True string='Attribute Value' args: 'product.template.attribute.value'
  • custom_value Char
    args: 'Custom Value'
  • name Char
    compute='_compute_name' args: 'Name'
  • sale_order_line_id Many2one → sale.order.line
    ondelete='cascade' required=True string='Sales Order Line' args: 'sale.order.line'
Public methods (0)

No public methods.

New fields (3)
  • display_type Selection
    readonly=True related='attribute_id.display_type'
  • html_color Char
    help="Here you can set a specific HTML color index (e.g. #ff0000) to display the color if the attribute type is 'Color'." string='Color'
  • is_custom Boolean
    help='Allow users to input custom values for this attribute value' args: 'Is custom value'
Public methods (0)

No public methods.

New fields (1)
  • sales_count Float
    compute='_compute_sales_count' string='Sold'
Public methods (1)
  • action_view_sales(self)

New fields (8)
  • expense_policy Selection
    default='no' help='Expenses and vendor bills can be re-invoiced to a customer.With this option, a validated expense can be re-invoice to a customer at its cost or sales price.' string='Re-Invoice Expenses' args: [('no', 'No'), ('cost', 'At cost'), ('sales_price', 'Sales price')]
  • invoice_policy Selection
    default='order' help='Ordered Quantity: Invoice quantities ordered by the customer.\nDelivered Quantity: Invoice quantities delivered to the customer.' string='Invoicing Policy' args: [('order', 'Ordered quantities'), ('delivery', 'Delivered quantities')]
  • sale_line_warn Selection
    default='no-message' help=WARNING_HELP required=True args: WARNING_MESSAGE, 'Sales Order Line'
  • sale_line_warn_msg Text
    args: 'Message for Sales Order Line'
  • sales_count Float
    compute='_compute_sales_count' string='Sold'
  • service_type Selection
    default='manual' help='Manually set quantities on order: Invoice based on the manually entered quantity, without creating an analytic account.\nTimesheets on contract: Invoice based on the tracked hours on the related timesheet.\nCreate a task and track hours: Create a task on the sales order validation and track the work hours.' string='Track Service' args: [('manual', 'Manually set quantities on order')]
  • visible_expense_policy Boolean
    compute='_compute_visible_expense_policy' default=<expr> args: 'Re-Invoice Policy visible'
  • visible_qty_configurator Boolean
    compute='_compute_visible_qty_configurator' args: 'Quantity visible in configurator'
Public methods (3)
  • action_view_sales(self)
  • create_product_variant(self, product_template_attribute_value_ids)
    Create if necessary and possible and return the id of the product variant matching the given combination for this template. Note AWA: Known "exploit" issues with this method: - This method could be used by an unauthenticated user to generate a lot of useless variants. Unfortunately, after discussing the matter with ODO, there's no easy and user-friendly way to block that behavior. We would have to use captcha/server actions to clean/... that are all not user-friendly/overkill mechanisms. - This method could be used to try to guess what product variant ids are created in the system and what product template ids are configured as "dynamic", but that does not seem like a big deal. The error messages are identical on purpose to avoid giving too much information to a potential attacker: - returning 0 when failing - returning the variant id whether it already existed or not :param product_template_attribute_value_ids: the combination for which to get or create variant :type product_template_attribute_value_ids: json encoded list of id of `product.template.attribute.value` :return: id of the product variant matching the combination or 0 :rtype: int
  • get_import_templates(self)
    @api.model

New fields (3)
  • display_type Selection
    readonly=True related='product_attribute_value_id.display_type'
  • html_color Char
    related='product_attribute_value_id.html_color' args: 'HTML Color Index'
  • is_custom Boolean
    related='product_attribute_value_id.is_custom' args: 'Is custom value'
Public methods (0)

No public methods.

New fields (15)
  • analytic_account_id Many2one → account.analytic.account
    readonly=True args: 'account.analytic.account', 'Analytic Account'
  • categ_id Many2one → product.category
    readonly=True args: 'product.category', 'Product Category'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Partner Country'
  • date_order Datetime
    readonly=True string='Date Order'
  • name Char
    readonly=True args: 'Order Reference'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Partner'
  • price_subtotal Float
    readonly=True string='Price Subtotal'
  • price_total Float
    readonly=True args: 'Total'
  • pricelist_id Many2one → product.pricelist
    readonly=True args: 'product.pricelist', 'Pricelist'
  • product_id Many2one → product.product
    readonly=True string='Product' args: 'product.product'
  • product_qty Float
    readonly=True args: 'Product Quantity'
  • product_tmpl_id Many2one → product.template
    readonly=True args: 'product.template', 'Product Template'
  • team_id Many2one → crm.team
    readonly=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    readonly=True args: 'res.users', 'Salesperson'
Public methods (2)
  • get_main_request(self)
  • init(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (7)
  • portal_confirmation_pay Boolean
    string='Online Payment'
  • portal_confirmation_sign Boolean
    default=True string='Online Signature'
  • quotation_validity_days Integer
    default=30 string='Default Quotation Validity (Days)'
  • sale_onboarding_order_confirmation_state Selection
    default='not_done' string='State of the onboarding confirmation order step' args: [('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done')]
  • sale_onboarding_payment_method Selection
    string='Sale onboarding selected payment method' args: [('digital_signature', 'Sign online'), ('paypal', 'PayPal'), ('stripe', 'Stripe'), ('other', 'Pay with another payment acquirer'), ('manual', 'Manual Payment')]
  • sale_onboarding_sample_quotation_state Selection
    default='not_done' string='State of the onboarding sample quotation step' args: [('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done')]
  • sale_quotation_onboarding_state Selection
    default='not_done' string='State of the sale onboarding panel' args: [('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')]
Public methods (4)
  • action_close_sale_quotation_onboarding(self)
    @api.model
    Mark the onboarding panel as closed.
  • action_open_sale_onboarding_payment_acquirer(self)
    @api.model
    Called by onboarding panel above the quotation list.
  • action_open_sale_onboarding_sample_quotation(self)
    @api.model
    Onboarding step for sending a sample quotation. Open a window to compose an email, with the edi_invoice_template message loaded by default.
  • get_and_update_sale_quotation_onboarding_state(self)
    This method is called on the controller rendering method and ensures that the animations are displayed only one time.

New fields (26)
  • auth_signup_uninvited Selection
    config_parameter='auth_signup.invitation_scope' default='b2b' string='Customer Account' args: [('b2b', 'On invitation'), ('b2c', 'Free sign up')]
  • automatic_invoice Boolean
    config_parameter='sale.automatic_invoice' help='The invoice is generated automatically and available in the customer portal when the transaction is confirmed by the payment acquirer.\nThe invoice is marked as paid and the payment is registered in the payment journal defined in the configuration of the payment acquirer.\nThis mode is advised if you issue the final invoice at the order and not after the delivery.' args: 'Automatic Invoice'
  • confirmation_template_id Many2one → mail.template
    config_parameter='sale.default_confirmation_template' domain="[('model', '=', 'sale.order')]" help='Email sent to the customer once the order is paid.' string='Confirmation Email' args: 'mail.template'
  • default_invoice_policy Selection
    default='order' default_model='product.template' args: [('order', 'Invoice what is ordered'), ('delivery', 'Invoice what is delivered')], 'Invoicing Policy'
  • deposit_default_product_id Many2one → product.product
    config_parameter='sale.default_deposit_product_id' domain="[('type', '=', 'service')]" help='Default product used for payment advances' args: 'product.product', 'Deposit Product'
  • group_auto_done_setting Boolean
    implied_group='sale.group_auto_done_setting' args: 'Lock Confirmed Sales'
  • group_proforma_sales Boolean
    help='Allows you to send pro-forma invoice.' implied_group='sale.group_proforma_sales' string='Pro-Forma Invoice'
  • group_sale_delivery_address Boolean
    implied_group='sale.group_delivery_invoice_address' args: 'Customer Addresses'
  • group_warning_sale Boolean
    implied_group='sale.group_warning_sale' args: 'Sale Order Warnings'
  • module_delivery Boolean
    args: 'Shipping Costs'
  • module_delivery_bpost Boolean
    args: 'bpost Connector'
  • module_delivery_dhl Boolean
    args: 'DHL Express Connector'
  • module_delivery_easypost Boolean
    args: 'Easypost Connector'
  • module_delivery_fedex Boolean
    args: 'FedEx Connector'
  • module_delivery_ups Boolean
    args: 'UPS Connector'
  • module_delivery_usps Boolean
    args: 'USPS Connector'
  • module_product_email_template Boolean
    args: 'Specific Email'
  • module_sale_amazon Boolean
    args: 'Amazon Sync'
  • module_sale_coupon Boolean
    args: 'Coupons & Promotions'
  • module_sale_margin Boolean
    args: 'Margins'
  • module_website_sale_digital Boolean
    args: 'Digital Content'
  • portal_confirmation_pay Boolean
    readonly=False related='company_id.portal_confirmation_pay' string='Online Payment'
  • portal_confirmation_sign Boolean
    readonly=False related='company_id.portal_confirmation_sign' string='Online Signature'
  • quotation_validity_days Integer
    readonly=False related='company_id.quotation_validity_days' string='Default Quotation Validity (Days)'
  • template_id Many2one → mail.template
    config_parameter='sale.default_email_template' default=<expr> domain="[('model', '=', 'account.move')]" args: 'mail.template', 'Email Template'
  • use_quotation_validity_days Boolean
    config_parameter='sale.use_quotation_validity_days' args: 'Default Quotation Validity'
Public methods (1)
  • set_values(self)

New fields (4)
  • sale_order_count Integer
    compute='_compute_sale_order_count' string='Sale Order Count'
  • sale_order_ids One2many → sale.order
    args: 'sale.order', 'partner_id', 'Sales Order'
  • sale_warn Selection
    default='no-message' help=WARNING_HELP args: WARNING_MESSAGE, 'Sales Warnings'
  • sale_warn_msg Text
    args: 'Message for Sales Order'
Public methods (2)
  • action_view_sale_order(self)
  • can_edit_vat(self)
    Can't edit `vat` if there is (non draft) issued SO.

New fields (10)
  • advance_payment_method Selection
    default='delivered' help='A standard invoice is issued with all the order lines ready for invoicing, according to their invoicing policy (based on ordered or delivered quantity).' required=True string='Create Invoice' args: [('delivered', 'Regular invoice'), ('percentage', 'Down payment (percentage)'), ('fixed', 'Down payment (fixed amount)')]
  • amount Float
    digits='Account' help='The percentage of amount to be invoiced in advance, taxes excluded.' args: 'Down Payment Amount'
  • count Integer
    default=_count string='Order Count'
  • currency_id Many2one → res.currency
    default=_default_currency_id string='Currency' args: 'res.currency'
  • deduct_down_payments Boolean
    default=True args: 'Deduct down payments'
  • deposit_account_id Many2one → account.account
    default=_default_deposit_account_id domain=[('deprecated', '=', False)] help='Account used for deposits' string='Income Account' args: 'account.account'
  • deposit_taxes_id Many2many → account.tax
    default=_default_deposit_taxes_id help='Taxes used for deposits' string='Customer Taxes' args: 'account.tax'
  • fixed_amount Monetary
    help='The fixed amount to be invoiced in advance, taxes excluded.' args: 'Down Payment Amount(Fixed)'
  • has_down_payments Boolean
    default=_default_has_down_payment readonly=True args: 'Has down payments'
  • product_id Many2one → product.product
    default=_default_product_id domain=[('type', '=', 'service')] string='Down Payment Product' args: 'product.product'
Public methods (2)
  • create_invoices(self)
  • onchange_advance_payment_method(self)
    @api.onchange('advance_payment_method')

New fields (42)
  • amount_by_group Binary
    compute='_amount_by_group' help='type: [(name, amount, base, formated amount, formated base)]' string='Tax amount by group'
  • amount_tax Monetary
    compute='_amount_all' readonly=True store=True string='Taxes'
  • amount_total Monetary
    compute='_amount_all' readonly=True store=True string='Total' tracking=4
  • amount_undiscounted Float
    compute='_compute_amount_undiscounted' digits=0 args: 'Amount Before Discount'
  • amount_untaxed Monetary
    compute='_amount_all' readonly=True store=True string='Untaxed Amount' tracking=5
  • analytic_account_id Many2one → account.analytic.account
    check_company=True copy=False domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='The analytic account related to a sales order.' readonly=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} args: 'account.analytic.account', 'Analytic Account'
  • authorized_transaction_ids Many2many → payment.transaction
    compute='_compute_authorized_transaction_ids' copy=False readonly=True string='Authorized Transactions' args: 'payment.transaction'
  • client_order_ref Char
    copy=False string='Customer Reference'
  • commitment_date Datetime
    copy=False help='This is the delivery date promised to the customer. If set, the delivery order will be scheduled based on this date rather than product lead times.' readonly=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} args: 'Delivery Date'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company', 'Company'
  • create_date Datetime
    help='Date on which sales order is created.' index=True readonly=True string='Creation Date'
  • currency_id Many2one → res.currency
    readonly=True related='pricelist_id.currency_id' required=True string='Currency' args: 'res.currency'
  • currency_rate Float
    compute='_compute_currency_rate' compute_sudo=True digits=(12, 6) help='The rate of the currency to the currency of rate 1 applicable at the date of the order' readonly=True store=True args: 'Currency Rate'
  • date_order Datetime
    copy=False default=fields.Datetime.now help='Creation date of draft/sent orders,\nConfirmation date of confirmed orders.' index=True readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Order Date'
  • expected_date Datetime
    compute='_compute_expected_date' help='Delivery date you can promise to the customer, computed from the minimum lead time of the order lines.' store=False args: 'Expected Date'
  • fiscal_position_id Many2one → account.fiscal.position
    check_company=True domain="[('company_id', '=', company_id)]" help='Fiscal positions are used to adapt taxes and accounts for particular customers or sales orders/invoices.The default value comes from the customer.' string='Fiscal Position' args: 'account.fiscal.position'
  • invoice_count Integer
    compute='_get_invoiced' readonly=True string='Invoice Count'
  • invoice_ids Many2many → account.move
    compute='_get_invoiced' copy=False readonly=True search='_search_invoice_ids' string='Invoices' args: 'account.move'
  • invoice_status Selection
    compute='_get_invoice_status' readonly=True store=True string='Invoice Status' args: [('upselling', 'Upselling Opportunity'), ('invoiced', 'Fully Invoiced'), ('to invoice', 'To Invoice'), ('no', 'Nothing to Invoice')]
  • is_expired Boolean
    compute='_compute_is_expired' string='Is expired'
  • name Char
    copy=False default=<expr> index=True readonly=True required=True states={'draft': [('readonly', False)]} string='Order Reference'
  • note Text
    default=_default_note args: 'Terms and conditions'
  • order_line One2many → sale.order.line
    auto_join=True copy=True states={'cancel': [('readonly', True)], 'done': [('readonly', True)]} string='Order Lines' args: 'sale.order.line', 'order_id'
  • origin Char
    help='Reference of the document that generated this sales order request.' string='Source Document'
  • partner_id Many2one → res.partner
    change_default=True domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" index=True readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Customer' tracking=1 args: 'res.partner'
  • partner_invoice_id Many2one → res.partner
    domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)], 'sale': [('readonly', False)]} string='Invoice Address' args: 'res.partner'
  • partner_shipping_id Many2one → res.partner
    domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)], 'sale': [('readonly', False)]} string='Delivery Address' args: 'res.partner'
  • payment_term_id Many2one → account.payment.term
    check_company=True domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" string='Payment Terms' args: 'account.payment.term'
  • pricelist_id Many2one → product.pricelist
    check_company=True domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='If you change the pricelist, only newly added lines will be affected.' readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Pricelist' args: 'product.pricelist'
  • reference Char
    copy=False help='The payment communication of this sale order.' string='Payment Ref.'
  • remaining_validity_days Integer
    compute='_compute_remaining_validity_days' string='Remaining Days Before Expiration'
  • require_payment Boolean
    default=_get_default_require_payment help='Request an online payment to the customer in order to confirm orders automatically.' readonly=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} args: 'Online Payment'
  • require_signature Boolean
    default=_get_default_require_signature help='Request a online signature to the customer in order to confirm orders automatically.' readonly=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} args: 'Online Signature'
  • signature Image
    attachment=True copy=False help='Signature received through the portal.' max_height=1024 max_width=1024 args: 'Signature'
  • signed_by Char
    copy=False help='Name of the person that signed the SO.' args: 'Signed By'
  • signed_on Datetime
    copy=False help='Date of the signature.' args: 'Signed On'
  • state Selection
    copy=False default='draft' index=True readonly=True string='Status' tracking=3 args: [('draft', 'Quotation'), ('sent', 'Quotation Sent'), ('sale', 'Sales Order'), ('done', 'Locked'), ('cancel', 'Cancelled')]
  • team_id Many2one → crm.team
    change_default=True check_company=True default=_get_default_team domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" args: 'crm.team', 'Sales Team'
  • transaction_ids Many2many → payment.transaction
    copy=False readonly=True string='Transactions' args: 'payment.transaction', 'sale_order_transaction_rel', 'sale_order_id', 'transaction_id'
  • type_name Char
    compute='_compute_type_name' args: 'Type Name'
  • user_id Many2one → res.users
    default=<expr> domain=<expr> index=True string='Salesperson' tracking=2 args: 'res.users'
  • validity_date Date
    copy=False default=_default_validity_date readonly=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Expiration'
Public methods (26)
  • action_cancel(self)
  • action_confirm(self)
  • action_done(self)
  • action_draft(self)
  • action_quotation_send(self)
    Opens a wizard to compose an email, with relevant mail template loaded by default
  • action_quotation_sent(self)
  • action_unlock(self)
  • action_view_invoice(self)
  • add_option_to_order_with_taxcloud(self)
  • copy_data(self, default=None)
  • create(self, vals)
    @api.model
  • get_empty_list_help(self, help)
    @api.model
  • get_portal_last_transaction(self)
  • has_to_be_paid(self, include_draft=False)
  • has_to_be_signed(self, include_draft=False)
  • message_post(self, **kwargs)
    @api.returns('mail.message', <expr>)
  • name_get(self)
  • onchange_partner_id(self)
    @api.onchange('partner_id')
    Update the following fields when the partner is changed: - Pricelist - Payment terms - Invoice address - Delivery address - Sales Team
  • onchange_partner_id_warning(self)
    @api.onchange('partner_id')
  • onchange_partner_shipping_id(self)
    @api.onchange('partner_shipping_id', 'partner_id', 'company_id')
    Trigger the change of fiscal position when the shipping address is modified.
  • onchange_user_id(self)
    @api.onchange('user_id')
  • payment_action_capture(self)
  • payment_action_void(self)
  • preview_sale_order(self)
  • unlink(self)
  • validate_taxes_on_sales_order(self)

New fields (40)
  • analytic_line_ids One2many → account.analytic.line
    string='Analytic lines' args: 'account.analytic.line', 'so_line'
  • analytic_tag_ids Many2many → account.analytic.tag
    domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" string='Analytic Tags' args: 'account.analytic.tag'
  • company_id Many2one
    index=True readonly=True related='order_id.company_id' store=True string='Company'
  • currency_id Many2one
    depends=['order_id.currency_id'] readonly=True related='order_id.currency_id' store=True string='Currency'
  • customer_lead Float
    default=0.0 help='Number of days between the order confirmation and the shipping of the products to the customer' required=True args: 'Lead Time'
  • discount Float
    default=0.0 digits='Discount' string='Discount (%)'
  • display_type Selection
    default=False help='Technical field for UX purpose.' args: [('line_section', 'Section'), ('line_note', 'Note')]
  • invoice_lines Many2many → account.move.line
    copy=False string='Invoice Lines' args: 'account.move.line', 'sale_order_line_invoice_rel', 'order_line_id', 'invoice_line_id'
  • invoice_status Selection
    compute='_compute_invoice_status' default='no' readonly=True store=True string='Invoice Status' args: [('upselling', 'Upselling Opportunity'), ('invoiced', 'Fully Invoiced'), ('to invoice', 'To Invoice'), ('no', 'Nothing to Invoice')]
  • is_downpayment Boolean
    help='Down payments are made when creating invoices from a sales order. They are not copied when duplicating a sales order.' string='Is a down payment'
  • is_expense Boolean
    help='Is true if the sales order line comes from an expense or a vendor bills' args: 'Is expense'
  • name Text
    required=True string='Description'
  • order_id Many2one → sale.order
    copy=False index=True ondelete='cascade' required=True string='Order Reference' args: 'sale.order'
  • order_partner_id Many2one
    readonly=False related='order_id.partner_id' store=True string='Customer'
  • price_reduce Float
    compute='_get_price_reduce' digits='Product Price' readonly=True store=True string='Price Reduce'
  • price_reduce_taxexcl Monetary
    compute='_get_price_reduce_notax' readonly=True store=True string='Price Reduce Tax excl'
  • price_reduce_taxinc Monetary
    compute='_get_price_reduce_tax' readonly=True store=True string='Price Reduce Tax inc'
  • price_subtotal Monetary
    compute='_compute_amount' readonly=True store=True string='Subtotal'
  • price_tax Float
    compute='_compute_amount' readonly=True store=True string='Total Tax'
  • price_total Monetary
    compute='_compute_amount' readonly=True store=True string='Total'
  • price_unit Float
    default=0.0 digits='Product Price' required=True args: 'Unit Price'
  • product_custom_attribute_value_ids One2many → product.attribute.custom.value
    copy=True string='Custom Values' args: 'product.attribute.custom.value', 'sale_order_line_id'
  • product_id Many2one → product.product
    change_default=True check_company=True domain="[('sale_ok', '=', True), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" ondelete='restrict' string='Product' args: 'product.product'
  • product_no_variant_attribute_value_ids Many2many → product.template.attribute.value
    ondelete='restrict' string='Extra Values' args: 'product.template.attribute.value'
  • product_template_id Many2one → product.template
    domain=[('sale_ok', '=', True)] related='product_id.product_tmpl_id' string='Product Template' args: 'product.template'
  • product_uom Many2one → uom.uom
    domain="[('category_id', '=', product_uom_category_id)]" string='Unit of Measure' args: 'uom.uom'
  • product_uom_category_id Many2one
    readonly=True related='product_id.uom_id.category_id'
  • product_uom_qty Float
    default=1.0 digits='Product Unit of Measure' required=True string='Quantity'
  • product_updatable Boolean
    compute='_compute_product_updatable' default=True readonly=True string='Can Edit Product'
  • qty_delivered Float
    compute='_compute_qty_delivered' compute_sudo=True copy=False default=0.0 digits='Product Unit of Measure' inverse='_inverse_qty_delivered' store=True args: 'Delivered Quantity'
  • qty_delivered_manual Float
    copy=False default=0.0 digits='Product Unit of Measure' args: 'Delivered Manually'
  • qty_delivered_method Selection
    compute='_compute_qty_delivered_method' compute_sudo=True help='According to product configuration, the delivered quantity can be automatically computed by mechanism :\n - Manual: the quantity is set manually on the line\n - Analytic From expenses: the quantity is the quantity sum from posted expenses\n - Timesheet: the quantity is the sum of hours recorded on tasks linked to this sale line\n - Stock Moves: the quantity comes from confirmed pickings\n' readonly=True store=True string='Method to update delivered qty' args: [('manual', 'Manual'), ('analytic', 'Analytic From Expenses')]
  • qty_invoiced Float
    compute='_get_invoice_qty' compute_sudo=True digits='Product Unit of Measure' readonly=True store=True string='Invoiced Quantity'
  • qty_to_invoice Float
    compute='_get_to_invoice_qty' digits='Product Unit of Measure' readonly=True store=True string='To Invoice Quantity'
  • salesman_id Many2one
    readonly=True related='order_id.user_id' store=True string='Salesperson'
  • sequence Integer
    default=10 string='Sequence'
  • state Selection
    copy=False default='draft' readonly=True related='order_id.state' store=True string='Order Status' args: [('draft', 'Quotation'), ('sent', 'Quotation Sent'), ('sale', 'Sales Order'), ('done', 'Done'), ('cancel', 'Cancelled')]
  • tax_id Many2many → account.tax
    context={'active_test': False} string='Taxes' args: 'account.tax'
  • untaxed_amount_invoiced Monetary
    compute='_compute_untaxed_amount_invoiced' compute_sudo=True store=True args: 'Untaxed Invoiced Amount'
  • untaxed_amount_to_invoice Monetary
    compute='_compute_untaxed_amount_to_invoice' compute_sudo=True store=True args: 'Untaxed Amount To Invoice'
Public methods (7)
  • create(self, vals_list)
    @api.model_create_multi
  • get_sale_order_line_multiline_description_sale(self, product)
    Compute a default multiline description for this sales order line. In most cases the product description is enough but sometimes we need to append information that only exists on the sale order line itself. e.g: - custom attributes and attributes that don't create variants, both introduced by the "product configurator" - in event_sale we need to know specifically the sales order line as well as the product to generate the name: the product is not sufficient because we also need to know the event_id and the event_ticket_id (both which belong to the sale order line).
  • name_get(self)
  • product_id_change(self)
    @api.onchange('product_id')
  • product_uom_change(self)
    @api.onchange('product_uom', 'product_uom_qty')
  • unlink(self)
  • write(self, values)

New fields (1)
  • payment_method Selection
    default=_get_default_payment_method selection_add=[('digital_signature', 'Online signature'), ('paypal', 'PayPal'), ('stripe', 'Credit card (via Stripe)'), ('other', 'Other payment acquirer'), ('manual', 'Custom payment instructions')]
Public methods (1)
  • add_payment_methods(self, *args, **kwargs)

New fields (33)
  • analytic_account_id Many2one → account.analytic.account
    readonly=True args: 'account.analytic.account', 'Analytic Account'
  • campaign_id Many2one → utm.campaign
    args: 'utm.campaign', 'Campaign'
  • categ_id Many2one → product.category
    readonly=True args: 'product.category', 'Product Category'
  • commercial_partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Customer Entity'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Customer Country'
  • date Datetime
    readonly=True args: 'Order Date'
  • discount Float
    readonly=True args: 'Discount %'
  • discount_amount Float
    readonly=True args: 'Discount Amount'
  • industry_id Many2one → res.partner.industry
    readonly=True args: 'res.partner.industry', 'Customer Industry'
  • medium_id Many2one → utm.medium
    args: 'utm.medium', 'Medium'
  • name Char
    readonly=True args: 'Order Reference'
  • nbr Integer
    readonly=True args: '# of Lines'
  • order_id Many2one → sale.order
    readonly=True args: 'sale.order', 'Order #'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Customer'
  • price_subtotal Float
    readonly=True args: 'Untaxed Total'
  • price_total Float
    readonly=True args: 'Total'
  • pricelist_id Many2one → product.pricelist
    readonly=True args: 'product.pricelist', 'Pricelist'
  • product_id Many2one → product.product
    readonly=True args: 'product.product', 'Product Variant'
  • product_tmpl_id Many2one → product.template
    readonly=True args: 'product.template', 'Product'
  • product_uom Many2one → uom.uom
    readonly=True args: 'uom.uom', 'Unit of Measure'
  • product_uom_qty Float
    readonly=True args: 'Qty Ordered'
  • qty_delivered Float
    readonly=True args: 'Qty Delivered'
  • qty_invoiced Float
    readonly=True args: 'Qty Invoiced'
  • qty_to_invoice Float
    readonly=True args: 'Qty To Invoice'
  • source_id Many2one → utm.source
    args: 'utm.source', 'Source'
  • state Selection
    readonly=True string='Status' args: [('draft', 'Draft Quotation'), ('sent', 'Quotation Sent'), ('sale', 'Sales Order'), ('done', 'Sales Done'), ('cancel', 'Cancelled')]
  • team_id Many2one → crm.team
    readonly=True args: 'crm.team', 'Sales Team'
  • untaxed_amount_invoiced Float
    readonly=True args: 'Untaxed Amount Invoiced'
  • untaxed_amount_to_invoice Float
    readonly=True args: 'Untaxed Amount To Invoice'
  • user_id Many2one → res.users
    readonly=True args: 'res.users', 'Salesperson'
  • volume Float
    readonly=True args: 'Volume'
  • weight Float
    readonly=True args: 'Gross Weight'
Public methods (1)
  • init(self)

New fields (4)
  • company_id Many2one → res.company
    default=<expr> readonly=True states={'draft': [('readonly', False)], 'refused': [('readonly', False)]} string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    related='company_id.currency_id' string='Currency' args: 'res.currency'
  • invoiced_amount Integer
    compute='_compute_sale_invoiced_amount' default=0 string='Revenues generated by the campaign'
  • quotation_count Integer
    compute='_compute_quotation_count' groups='sales_team.group_sale_salesman' args: 'Quotation Count'
Public methods (2)
  • action_redirect_to_invoiced(self)
  • action_redirect_to_quotations(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/12.0/sale
VERSION
VERSION 1.1
CATEGORY
CATEGORYSales
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Christophe Matthieu, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Goffin Simon, Simon Lejeune, Nicolas Martinelli, Nicolas Lempereur, xmo-odoo, qdp-odoo, Géry Debongnie, Aaron Bohy, Jeremy Kersten, GitHub, Lucas Perais (lpe), Damien Bouvy, Yannick Tivisse, Alexandre Kühn, qsm-odoo, Pierre Masereel, Romain Derie, De Paoli Quentin, Toufik Benjaa, jem-odoo, Adrien Dieudonne, RomainLibert, Julien (juc) Castiaux, Jorge Pinna Puissant, Jairo Llopis, Gert Pellin - GPE, Nans Lefebvre, Alexandre Kühn, Toufik Ben Jaa, Adrian Torres, Nathan de Pryck, XavierDo, Julien Castiaux, Aurélien Warnon, Xavier-Do, Denis Roussel, jvm-odoo, Andreas Perhab, jerome hanke (jhk), Carlos Dauden, Victor Feyens, Florimond Husquinet (fhu), Andrea Grazioso (agr-odoo), William Henrotin, Sébastien Theys, Nasreddin (bon), oco-odoo, fw-bot, Anh Thao Pham (pta), Adrien Horgnies, Stéphane Bidoul (ACSONE), Nikunj Ladava, Luis González, Kinjal Mehta, David Beguin, Adrien Widart, Ivan Yelizariev, nie, TWA, Parth Choksi, Jinal Patel, Tonow-c2c, sbejaoui, Jared Kipe
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:57:01
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - payment
    - account
    - product
    - decimal_precision
    - uom
    - analytic
    - portal
    - http_routing
    - digest
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module contains all the common features of Sales Management and eCommerce.
    

Code Analysis

Views touched (79)
XML IDNameModelTypeStatus
account_invoice_form Account Invoice account.invoice data Inherits account.invoice_form
account_invoice_groupby_inherit account.invoice.groupby account.invoice xpath Inherits account.view_account_invoice_filter
account_invoice_line_form account.invoice.line.form account.invoice.line data Inherits account.view_invoice_line_form
account_invoice_line_tree account.invoice.line.tree account.invoice.line data Inherits account.view_invoice_line_tree
account_invoice_supplier_form account.invoice.supplier.form account.invoice data Inherits account.invoice_supplier_form
acquirer_form_inherit_sale payment.acquirer.form.inherit.sale.payment payment.acquirer xpath Inherits payment.acquirer_form
assets_backend_inherit_sale Sale backend assets ir.ui.view qweb Inherits web.assets_backend
assets_frontend_inherit_sale Sale frontend assets ir.ui.view qweb Inherits web.assets_frontend
attribute_tree_view product.attribute.tree.type product.attribute field Inherits product.attribute_tree_view
crm_lead_partner_kanban_view res.partner.kanban.saleorder.inherit res.partner field Inherits base.res_partner_kanban_view
crm_team_salesteams_view_form crm.team.form crm.team xpath Inherits sales_team.crm_team_view_form
crm_team_salesteams_view_kanban crm.team.kanban crm.team data Inherits sales_team.crm_team_salesteams_view_kanban
mail_notification_paynow_online oezirhgoi ir.ui.view qweb Inherits mail.mail_notification_paynow
onboarding_quotation_layout_step onboarding_quotation_layout_step ir.ui.view qweb New
optional_product_items optional_product_items ir.ui.view qweb New
optional_products_modal Optional Products ir.ui.view qweb New
portal_my_home_menu_sale Portal layout : sales menu entries ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home_sale Portal My Home : sales entries ir.ui.view qweb Inherits portal.portal_my_home
portal_my_orders My Sales Orders ir.ui.view qweb New
portal_my_quotations My Quotations ir.ui.view qweb New
product_attribute_view_form product.attribute.form.inherit product.attribute xpath Inherits product.product_attribute_view_form
product_configurator_configure Configure ir.ui.view qweb New
product_configurator_configure_optional_products product_configurator_configure_optional_products ir.ui.view qweb New
product_form_view_sale_order_button product.product.sale.order product.product button Inherits product.product_normal_form_view
product_pricelist_view_form product.pricelist.form.inherit.product product.pricelist field Inherits product.product_pricelist_view
product_pricelist_view_kanban product.pricelist.kanban.inherit.product product.pricelist data Inherits product.product_pricelist_view_kanban
product_pricelist_view_tree product.pricelist.tree.inherit.product product.pricelist field Inherits product.product_pricelist_view_tree
product_template_attribute_line_form product.template.attribute.line.form.inherit product.template.attribute.line xpath Inherits product.product_template_attribute_line_form
product_template_attribute_value_view_form_inherit product.template.attribute.value.view.form.inherit product.template.attribute.value field Inherits product.product_template_attribute_value_view_form
product_template_attribute_value_view_tree_inherit product.template.attribute.value.view.tree.inherit product.template.attribute.value field Inherits product.product_template_attribute_value_view_tree
product_template_form_view product.template.product.website.form product.template xpath Inherits product.product_template_form_view
product_template_form_view_invoice_policy product.template.invoice.policy product.template xpath Inherits product.product_template_form_view
product_template_form_view_sale_order_button product.template.sale.order.button product.template button Inherits product.product_template_only_form_view
qunit_suite product_configurator_tests ir.ui.view qweb Inherits web.qunit_suite
qunit_suite sales_team_dashboard_tests ir.ui.view qweb Inherits web.qunit_suite
report_all_channels_sales_view_pivot report.all.channels.sales.pivot report.all.channels.sales pivot New
report_all_channels_sales_view_search report.all.channels.sales.search report.all.channels.sales search New
report_assets_common_inherit_sale Sale report common assets ir.ui.view qweb Inherits web.report_assets_common
report_invoice_document_inherit_sale report_invoice_document_inherit_sale ir.ui.view qweb Inherits account.report_invoice_document
report_saleorder report_saleorder ir.ui.view qweb New
report_saleorder_document report_saleorder_document ir.ui.view qweb New
report_saleorder_pro_forma report_saleorder_pro_forma ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.sale res.config.settings xpath Inherits base.res_config_settings_view_form
res_partner_view_buttons res.partner.view.buttons res.partner button Inherits base.view_partner_form
res_partner_view_form_payment_defaultcreditcard res.partner.view.form.payment.defaultcreditcard res.partner button Inherits payment.view_partners_form_payment_defaultcreditcard
res_partner_view_form_property_inherit res.partner.view.form.property.inherit res.partner group Inherits account.view_partner_property_form
sale_onboarding_order_confirmation_form sale.order.confirmation.onboarding.form sale.payment.acquirer.onboarding.wizard xpath Inherits payment.payment_acquirer_onboarding_wizard_form
sale_onboarding_order_confirmation_step sale_onboarding_order_confirmation_step ir.ui.view qweb New
sale_onboarding_quotation_layout_form sale.onboarding.quotation.layout.form res.company xpath Inherits base.view_company_document_template_form
sale_onboarding_sample_quotation_form mail.compose.message.sale.onboarding.sample.quotation.form mail.compose.message xpath Inherits mail.email_compose_message_wizard_form
sale_onboarding_sample_quotation_step sale_onboarding_sample_quotation_step ir.ui.view qweb New
sale_order_line_view_form_readonly sale.order.line.form.readonly sale.order.line form New
sale_order_portal_content Sales Order Portal Content ir.ui.view qweb New
sale_order_portal_content_totals_table sale_order_portal_content_totals_table ir.ui.view qweb New
sale_order_portal_template Sales Order Portal Template ir.ui.view qweb Inherits portal.portal_sidebar
sale_order_view_search_inherit_quotation sale.order.search.inherit.quotation sale.order xpath Inherits sale.view_sales_order_filter
sale_order_view_search_inherit_sale sale.order.search.inherit.sale sale.order xpath Inherits sale.view_sales_order_filter
sale_product_configurator_view_form sale.product.configurator.view.form sale.product.configurator form New
sale_quotation_onboarding_panel sale.quotation.onboarding.panel ir.ui.view qweb New
transaction_form_inherit_sale payment.transaction.form.inherit.sale.payment payment.transaction xpath Inherits payment.transaction_form
variants variants ir.ui.view qweb New
variants_tree_view variants.template.tree product.attribute.value field Inherits product.variants_tree_view
view_account_invoice_report_search_inherit account.invoice.report.search.inherit account.invoice.report xpath Inherits account.view_account_invoice_report_search
view_order_form sale.order.form sale.order form New
view_order_form_editable_list sale.order.form.editable.list sale.order xpath Inherits sale.view_order_form
view_order_line_tree sale.order.line.tree sale.order.line tree New
view_order_product_graph sale.report.graph sale.report graph New
view_order_product_pivot sale.report.pivot sale.report pivot New
view_order_product_search sale.report.search sale.report search New
view_order_tree sale.order.tree sale.order tree New
view_quotation_tree sale.order.tree sale.order tree New
view_quotation_tree_with_onboarding sale.order.tree sale.order xpath Inherits view_quotation_tree
view_sale_advance_payment_inv Invoice Orders sale.advance.payment.inv form New
view_sale_order_calendar sale.order.calendar sale.order calendar New
view_sale_order_graph sale.order.graph sale.order graph New
view_sale_order_kanban sale.order.kanban sale.order kanban New
view_sale_order_pivot sale.order.pivot sale.order pivot New
view_sales_order_filter sale.order.list.select sale.order search New
view_sales_order_line_filter sale.order.line.select sale.order.line search New
Models touched (26)

New fields (1)
  • so_line Many2one → sale.order.line
    domain=<expr> string='Sales Order Item' args: 'sale.order.line'
Public methods (2)
  • create(self, values)
    @api.model
  • write(self, values)
    @api.multi

New fields (3)
  • comment Text
    default=_default_comment
  • partner_shipping_id Many2one → res.partner
    help='Delivery address for current invoice.' readonly=True states={'draft': [('readonly', False)]} string='Delivery Address' args: 'res.partner'
  • team_id Many2one → crm.team
    default=_get_default_team oldname='section_id' string='Sales Team' args: 'crm.team'
Public methods (4)
  • action_invoice_open(self)
    @api.multi
  • action_invoice_paid(self)
    @api.multi
  • get_delivery_partner_id(self)
    @api.multi
  • unlink(self)
    @api.multi

New fields (1)
  • sale_line_ids Many2many → sale.order.line
    copy=False readonly=True string='Sales Order Lines' args: 'sale.order.line', 'sale_order_line_invoice_rel', 'invoice_line_id', 'order_line_id'
Public methods (0)

No public methods.

New fields (1)
  • team_id Many2one → crm.team
    string='Sales Team' args: 'crm.team'
Public methods (0)

No public methods.

New fields (8)
  • dashboard_graph_model Selection
    selection_add=[('sale.report', 'Sales'), ('account.invoice.report', 'Invoices')]
  • invoiced Integer
    compute='_compute_invoiced' help='Invoice revenue for the current month. This is the amount the sales channel has invoiced this month. It is used to compute the progression ratio of the current and target revenue on the kanban view.' readonly=True string='Invoiced This Month'
  • invoiced_target Integer
    help='Target of invoice revenue for the current month. This is the amount the sales channel estimates to be able to invoice this month.' string='Invoicing Target'
  • quotations_amount Integer
    compute='_compute_quotations_to_invoice' readonly=True string='Amount of quotations to invoice'
  • quotations_count Integer
    compute='_compute_quotations_to_invoice' readonly=True string='Number of quotations to invoice'
  • sales_to_invoice_count Integer
    compute='_compute_sales_to_invoice' readonly=True string='Number of sales to invoice'
  • use_invoices Boolean
    help='Check this box to set an invoicing target for this Sales Team.' args: 'Set Invoicing Target'
  • use_quotations Boolean
    help='Check this box if you send quotations to your customers rather than confirming orders straight away. This will add specific action buttons to your dashboard.' string='Quotations'
Public methods (2)
  • action_primary_channel_button(self)
  • update_invoiced_target(self, value)
    @api.multi

New fields (1)
  • so_reference_type Selection
    default='so_name' help='You can set here the communication type that will appear on sales orders.The communication will be given to the customer when they choose the payment method.' selection=[('so_name', _('Based on Document Reference')), ('partner', _('Based on Customer ID'))] string='Communication'
Public methods (0)

No public methods.

New fields (2)
  • sale_order_ids Many2many → sale.order
    copy=False readonly=True string='Sales Orders' args: 'sale.order', 'sale_order_transaction_rel', 'transaction_id', 'sale_order_id'
  • sale_order_ids_nbr Integer
    compute='_compute_sale_order_ids_nbr' string='# of Sales Orders'
Public methods (2)
  • action_view_sales_orders(self)
    @api.multi
  • render_sale_button(self, order, submit_txt=None, render_values=None)

New fields (1)
  • type Selection
    default='radio' required=True args: [('radio', 'Radio'), ('select', 'Select'), ('color', 'Color')]
Public methods (0)

No public methods.

New fields (3)
  • attribute_value_id Many2one → product.attribute.value
    string='Attribute' args: 'product.attribute.value'
  • custom_value Char
    args: 'Custom value'
  • sale_order_line_id Many2one → sale.order.line
    string='Sale order line' args: 'sale.order.line'
Public methods (0)

No public methods.

New fields (2)
  • html_color Char
    help="Here you can set a\n specific HTML color index (e.g. #ff0000) to display the color if the\n attribute type is 'Color'." oldname='color' string='HTML Color Index'
  • is_custom Boolean
    help='Allow users to input custom values for this attribute value' args: 'Is custom value'
Public methods (0)

No public methods.

New fields (1)
  • discount_policy Selection
    default='with_discount' args: [('with_discount', 'Discount included in the price'), ('without_discount', 'Show public price & discount to the customer')]
Public methods (0)

No public methods.

New fields (1)
  • sales_count Float
    compute='_compute_sales_count' string='Sold'
Public methods (1)
  • action_view_sales(self)
    @api.multi

New fields (1)
  • optional_product_ids Many2many → product.template
    help='Optional Products are suggested whenever the customer hits *Add to Cart* (cross-sell strategy, e.g. for computers: warranty, software, etc.).' string='Optional Products' args: 'product.template', 'product_optional_rel', 'src_id', 'dest_id'
Public methods (0)

No public methods.

New fields (7)
  • expense_policy Selection
    default='no' help='Expenses and vendor bills can be re-invoiced to a customer.With this option, a validated expense can be re-invoice to a customer at its cost or sales price.' string='Re-Invoice Policy' args: [('no', 'No'), ('cost', 'At cost'), ('sales_price', 'Sales price')]
  • hide_expense_policy Boolean
    compute='_compute_hide_expense_policy'
  • invoice_policy Selection
    default='order' help='Ordered Quantity: Invoice quantities ordered by the customer.\nDelivered Quantity: Invoice quantities delivered to the customer.' string='Invoicing Policy' args: [('order', 'Ordered quantities'), ('delivery', 'Delivered quantities')]
  • sale_line_warn Selection
    default='no-message' help=WARNING_HELP required=True args: WARNING_MESSAGE, 'Sales Order Line'
  • sale_line_warn_msg Text
    args: 'Message for Sales Order Line'
  • sales_count Float
    compute='_compute_sales_count' string='Sold'
  • service_type Selection
    default='manual' help='Manually set quantities on order: Invoice based on the manually entered quantity, without creating an analytic account.\nTimesheets on contract: Invoice based on the tracked hours on the related timesheet.\nCreate a task and track hours: Create a task on the sales order validation and track the work hours.' oldname='track_service' string='Track Service' args: [('manual', 'Manually set quantities on order')]
Public methods (3)
  • action_view_sales(self)
    @api.multi
  • create_product_variant(self, product_template_attribute_value_ids)
    @api.multi
    Create if necessary and possible and return the id of the product variant matching the given combination for this template. Note AWA: Known "exploit" issues with this method: - This method could be used by an unauthenticated user to generate a lot of useless variants. Unfortunately, after discussing the matter with ODO, there's no easy and user-friendly way to block that behavior. We would have to use captcha/server actions to clean/... that are all not user-friendly/overkill mechanisms. - This method could be used to try to guess what product variant ids are created in the system and what product template ids are configured as "dynamic", but that does not seem like a big deal. The error messages are identical on purpose to avoid giving too much information to a potential attacker: - returning 0 when failing - returning the variant id whether it already existed or not :param product_template_attribute_value_ids: the combination for which to get or create variant :type product_template_attribute_value_ids: json encoded list of id of `product.template.attribute.value` :return: id of the product variant matching the combination or 0 :rtype: int
  • get_import_templates(self)
    @api.model

New fields (2)
  • html_color Char
    related='product_attribute_value_id.html_color' args: 'HTML Color Index'
  • is_custom Boolean
    related='product_attribute_value_id.is_custom' args: 'Is custom value'
Public methods (0)

No public methods.

New fields (15)
  • analytic_account_id Many2one → account.analytic.account
    readonly=True args: 'account.analytic.account', 'Analytic Account'
  • categ_id Many2one → product.category
    readonly=True args: 'product.category', 'Product Category'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Partner Country'
  • date_order Datetime
    readonly=True string='Date Order'
  • name Char
    readonly=True args: 'Order Reference'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Partner'
  • price_subtotal Float
    readonly=True string='Price Subtotal'
  • price_total Float
    readonly=True args: 'Total'
  • pricelist_id Many2one → product.pricelist
    readonly=True args: 'product.pricelist', 'Pricelist'
  • product_id Many2one → product.product
    readonly=True string='Product' args: 'product.product'
  • product_qty Float
    readonly=True args: 'Product Quantity'
  • product_tmpl_id Many2one → product.template
    readonly=True args: 'product.template', 'Product Template'
  • team_id Many2one → crm.team
    readonly=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    readonly=True args: 'res.users', 'Salesperson'
Public methods (2)
  • get_main_request(self)
  • init(self)
    @api.model_cr

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (8)
  • portal_confirmation_pay Boolean
    string='Online Payment'
  • portal_confirmation_sign Boolean
    string='Online Signature'
  • quotation_validity_days Integer
    default=30 string='Default Quotation Validity (Days)'
  • sale_note Text
    string='Default Terms and Conditions' translate=True
  • sale_onboarding_order_confirmation_state Selection
    default='not_done' string='State of the onboarding confirmation order step' args: [('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done')]
  • sale_onboarding_payment_method Selection
    string='Sale onboarding selected payment method' args: [('digital_signature', 'Sign online'), ('paypal', 'PayPal'), ('stripe', 'Stripe'), ('other', 'Pay with another payment acquirer'), ('manual', 'Wire Transfer')]
  • sale_onboarding_sample_quotation_state Selection
    default='not_done' string='State of the onboarding sample quotation step' args: [('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done')]
  • sale_quotation_onboarding_state Selection
    default='not_done' string='State of the sale onboarding panel' args: [('not_done', 'Not done'), ('just_done', 'Just done'), ('done', 'Done'), ('closed', 'Closed')]
Public methods (6)
  • action_close_sale_quotation_onboarding(self)
    @api.model
    Mark the onboarding panel as closed.
  • action_open_sale_onboarding_payment_acquirer(self)
    @api.model
    Called by onboarding panel above the quotation list.
  • action_open_sale_onboarding_quotation_layout(self)
    @api.model
    Onboarding step for the quotation layout.
  • action_open_sale_onboarding_sample_quotation(self)
    @api.model
    Onboarding step for sending a sample quotation. Open a window to compose an email, with the edi_invoice_template message loaded by default.
  • action_save_onboarding_quotation_layout(self)
    @api.multi
    Set the onboarding step as done
  • get_and_update_sale_quotation_onboarding_state(self)
    This method is called on the controller rendering method and ensures that the animations are displayed only one time.

New fields (31)
  • auth_signup_uninvited Selection
    config_parameter='auth_signup.invitation_scope' default='b2b' string='Customer Account' args: [('b2b', 'On invitation'), ('b2c', 'Free sign up')]
  • auto_done_setting Boolean
    config_parameter='sale.auto_done_setting' args: 'Lock Confirmed Sales'
  • automatic_invoice Boolean
    config_parameter='sale.automatic_invoice' help='The invoice is generated automatically and available in the customer portal when the transaction is confirmed by the payment acquirer.\nThe invoice is marked as paid and the payment is registered in the payment journal defined in the configuration of the payment acquirer.\nThis mode is advised if you issue the final invoice at the order and not after the delivery.' args: 'Automatic Invoice'
  • default_invoice_policy Selection
    default='order' default_model='product.template' args: [('order', 'Invoice what is ordered'), ('delivery', 'Invoice what is delivered')], 'Invoicing Policy'
  • deposit_default_product_id Many2one → product.product
    config_parameter='sale.default_deposit_product_id' domain="[('type', '=', 'service')]" help='Default product used for payment advances' oldname='default_deposit_product_id' args: 'product.product', 'Deposit Product'
  • group_discount_per_so_line Boolean
    implied_group='sale.group_discount_per_so_line' args: 'Discounts'
  • group_proforma_sales Boolean
    help='Allows you to send pro-forma invoice.' implied_group='sale.group_proforma_sales' string='Pro-Forma Invoice'
  • group_sale_delivery_address Boolean
    implied_group='sale.group_delivery_invoice_address' args: 'Customer Addresses'
  • group_sale_order_dates Boolean
    implied_group='sale.group_sale_order_dates' args: 'Delivery Date'
  • group_warning_sale Boolean
    implied_group='sale.group_warning_sale' args: 'Sale Order Warnings'
  • module_delivery Boolean
    args: 'Shipping Costs'
  • module_delivery_bpost Boolean
    args: 'bpost Connector'
  • module_delivery_dhl Boolean
    args: 'DHL Connector'
  • module_delivery_easypost Boolean
    args: 'Easypost Connector'
  • module_delivery_fedex Boolean
    args: 'FedEx Connector'
  • module_delivery_ups Boolean
    args: 'UPS Connector'
  • module_delivery_usps Boolean
    args: 'USPS Connector'
  • module_product_email_template Boolean
    args: 'Specific Email'
  • module_sale_coupon Boolean
    args: 'Coupons & Promotions'
  • module_sale_margin Boolean
    args: 'Margins'
  • module_website_sale_digital Boolean
    args: 'Digital Content'
  • multi_sales_price Boolean
    args: 'Multiple Sales Prices per Product'
  • multi_sales_price_method Selection
    default='percentage' string='Pricelists Method' args: [('percentage', 'Multiple prices per product (e.g. customer segments, currencies)'), ('formula', 'Prices computed from formulas (discounts, margins, roundings)')]
  • portal_confirmation_pay Boolean
    readonly=False related='company_id.portal_confirmation_pay' string='Online Payment'
  • portal_confirmation_sign Boolean
    readonly=False related='company_id.portal_confirmation_sign' string='Online Signature'
  • quotation_validity_days Integer
    readonly=False related='company_id.quotation_validity_days' string='Default Quotation Validity (Days)'
  • sale_note Text
    readonly=False related='company_id.sale_note' string='Terms & Conditions'
  • sale_pricelist_setting Selection
    config_parameter='sale.sale_pricelist_setting' string='Pricelists' args: [('fixed', 'A single sales price per product'), ('percentage', 'Multiple prices per product (e.g. customer segments, currencies)'), ('formula', 'Price computed from formulas (discounts, margins, roundings)')]
  • template_id Many2one → mail.template
    config_parameter='sale.default_email_template' default=<expr> domain="[('model', '=', 'account.invoice')]" args: 'mail.template', 'Email Template'
  • use_quotation_validity_days Boolean
    config_parameter='sale.use_quotation_validity_days' args: 'Default Quotation Validity'
  • use_sale_note Boolean
    config_parameter='sale.use_sale_note' oldname='default_use_sale_note' string='Default Terms & Conditions'
Public methods (3)
  • get_values(self)
    @api.model
  • sale_pricelist_setting_sync(self, pos_pricelist_setting)
  • set_values(self)

New fields (4)
  • sale_order_count Integer
    compute='_compute_sale_order_count' string='Sale Order Count'
  • sale_order_ids One2many → sale.order
    args: 'sale.order', 'partner_id', 'Sales Order'
  • sale_warn Selection
    default='no-message' help=WARNING_HELP args: WARNING_MESSAGE, 'Sales Warnings'
  • sale_warn_msg Text
    args: 'Message for Sales Order'
Public methods (1)
  • can_edit_vat(self)
    Can't edit `vat` if there is (non draft) issued SO.

New fields (6)
  • advance_payment_method Selection
    default=_get_advance_payment_method required=True string='What do you want to invoice?' args: [('delivered', 'Invoiceable lines'), ('all', 'Invoiceable lines (deduct down payments)'), ('percentage', 'Down payment (percentage)'), ('fixed', 'Down payment (fixed amount)')]
  • amount Float
    digits=dp.get_precision('Account') help='The amount to be invoiced in advance, taxes excluded.' args: 'Down Payment Amount'
  • count Integer
    default=_count string='Order Count'
  • deposit_account_id Many2one → account.account
    default=_default_deposit_account_id domain=[('deprecated', '=', False)] help='Account used for deposits' string='Income Account' args: 'account.account'
  • deposit_taxes_id Many2many → account.tax
    default=_default_deposit_taxes_id help='Taxes used for deposits' string='Customer Taxes' args: 'account.tax'
  • product_id Many2one → product.product
    default=_default_product_id domain=[('type', '=', 'service')] string='Down Payment Product' args: 'product.product'
Public methods (2)
  • create_invoices(self)
    @api.multi
  • onchange_advance_payment_method(self)
    @api.onchange('advance_payment_method')

New fields (42)
  • amount_by_group Binary
    compute='_amount_by_group' help='type: [(name, amount, base, formated amount, formated base)]' string='Tax amount by group'
  • amount_tax Monetary
    compute='_amount_all' readonly=True store=True string='Taxes'
  • amount_total Monetary
    compute='_amount_all' readonly=True store=True string='Total' track_sequence=6 track_visibility='always'
  • amount_undiscounted Float
    compute='_compute_amount_undiscounted' digits=0 args: 'Amount Before Discount'
  • amount_untaxed Monetary
    compute='_amount_all' readonly=True store=True string='Untaxed Amount' track_sequence=5 track_visibility='onchange'
  • analytic_account_id Many2one → account.analytic.account
    copy=False help='The analytic account related to a sales order.' oldname='project_id' readonly=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} args: 'account.analytic.account', 'Analytic Account'
  • authorized_transaction_ids Many2many → payment.transaction
    compute='_compute_authorized_transaction_ids' copy=False readonly=True string='Authorized Transactions' args: 'payment.transaction'
  • client_order_ref Char
    copy=False string='Customer Reference'
  • commitment_date Datetime
    copy=False help='This is the delivery date promised to the customer. If set, the delivery order will be scheduled based on this date rather than product lead times.' oldname='requested_date' readonly=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} args: 'Commitment Date'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • confirmation_date Datetime
    copy=False help='Date on which the sales order is confirmed.' index=True oldname='date_confirm' readonly=True string='Confirmation Date'
  • create_date Datetime
    help='Date on which sales order is created.' index=True readonly=True string='Creation Date'
  • currency_id Many2one → res.currency
    readonly=True related='pricelist_id.currency_id' required=True string='Currency' args: 'res.currency'
  • currency_rate Float
    compute='_compute_currency_rate' compute_sudo=True digits=(12, 6) help='The rate of the currency to the currency of rate 1 applicable at the date of the order' readonly=True store=True args: 'Currency Rate'
  • date_order Datetime
    copy=False default=fields.Datetime.now index=True readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Order Date'
  • expected_date Datetime
    compute='_compute_expected_date' help='Delivery date you can promise to the customer, computed from product lead times and from the shipping policy of the order.' oldname='commitment_date' store=False args: 'Expected Date'
  • fiscal_position_id Many2one → account.fiscal.position
    oldname='fiscal_position' string='Fiscal Position' args: 'account.fiscal.position'
  • invoice_count Integer
    compute='_get_invoiced' readonly=True string='Invoice Count'
  • invoice_ids Many2many → account.invoice
    compute='_get_invoiced' copy=False readonly=True search='_search_invoice_ids' string='Invoices' args: 'account.invoice'
  • invoice_status Selection
    compute='_get_invoiced' readonly=True store=True string='Invoice Status' args: [('upselling', 'Upselling Opportunity'), ('invoiced', 'Fully Invoiced'), ('to invoice', 'To Invoice'), ('no', 'Nothing to Invoice')]
  • is_expired Boolean
    compute='_compute_is_expired' string='Is expired'
  • name Char
    copy=False default=<expr> index=True readonly=True required=True states={'draft': [('readonly', False)]} string='Order Reference'
  • note Text
    default=_default_note args: 'Terms and conditions'
  • order_line One2many → sale.order.line
    auto_join=True copy=True states={'cancel': [('readonly', True)], 'done': [('readonly', True)]} string='Order Lines' args: 'sale.order.line', 'order_id'
  • origin Char
    help='Reference of the document that generated this sales order request.' string='Source Document'
  • partner_id Many2one → res.partner
    change_default=True help='You can find a customer by its Name, TIN, Email or Internal Reference.' index=True readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Customer' track_sequence=1 track_visibility='always' args: 'res.partner'
  • partner_invoice_id Many2one → res.partner
    help='Invoice address for current sales order.' readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)], 'sale': [('readonly', False)]} string='Invoice Address' args: 'res.partner'
  • partner_shipping_id Many2one → res.partner
    help='Delivery address for current sales order.' readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)], 'sale': [('readonly', False)]} string='Delivery Address' args: 'res.partner'
  • payment_term_id Many2one → account.payment.term
    oldname='payment_term' string='Payment Terms' args: 'account.payment.term'
  • pricelist_id Many2one → product.pricelist
    help='Pricelist for current sales order.' readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Pricelist' args: 'product.pricelist'
  • reference Char
    copy=False help='The payment communication of this sale order.' string='Payment Ref.'
  • remaining_validity_days Integer
    compute='_compute_remaining_validity_days' string='Remaining Validity Days'
  • require_payment Boolean
    default=_get_default_require_payment help='Request an online payment to the customer in order to confirm orders automatically.' readonly=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} args: 'Online Payment'
  • require_signature Boolean
    default=_get_default_require_signature help='Request a online signature to the customer in order to confirm orders automatically.' readonly=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} args: 'Online Signature'
  • signature Binary
    attachment=True copy=False help='Signature received through the portal.' args: 'Signature'
  • signed_by Char
    copy=False help='Name of the person that signed the SO.' args: 'Signed by'
  • state Selection
    copy=False default='draft' index=True readonly=True string='Status' track_sequence=3 track_visibility='onchange' args: [('draft', 'Quotation'), ('sent', 'Quotation Sent'), ('sale', 'Sales Order'), ('done', 'Locked'), ('cancel', 'Cancelled')]
  • team_id Many2one → crm.team
    change_default=True default=_get_default_team oldname='section_id' args: 'crm.team', 'Sales Team'
  • transaction_ids Many2many → payment.transaction
    copy=False readonly=True string='Transactions' args: 'payment.transaction', 'sale_order_transaction_rel', 'sale_order_id', 'transaction_id'
  • type_name Char
    compute='_compute_type_name' args: 'Type Name'
  • user_id Many2one → res.users
    default=<expr> index=True string='Salesperson' track_sequence=2 track_visibility='onchange' args: 'res.users'
  • validity_date Date
    copy=False default=_default_validity_date help="Validity date of the quotation, after this date, the customer won't be able to validate the quotation online." readonly=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Validity'
Public methods (26)
  • action_cancel(self)
    @api.multi
  • action_confirm(self)
    @api.multi
  • action_done(self)
    @api.multi
  • action_draft(self)
    @api.multi
  • action_invoice_create(self, grouped=False, final=False)
    @api.multi
    Create the invoice associated to the SO. :param grouped: if True, invoices are grouped by SO id. If False, invoices are grouped by (partner_invoice_id, currency) :param final: if True, refunds will be generated if necessary :returns: list of created invoices
  • action_quotation_send(self)
    @api.multi
    This function opens a window to compose an email, with the edi sale template message loaded by default
  • action_unlock(self)
    @api.multi
  • action_view_invoice(self)
    @api.multi
  • add_option_to_order_with_taxcloud(self)
  • copy_data(self, default=None)
    @api.multi
  • create(self, vals)
    @api.model
  • force_quotation_send(self)
    @api.multi
  • get_empty_list_help(self, help)
    @api.model
  • get_portal_last_transaction(self)
    @api.multi
  • has_to_be_paid(self, also_in_draft=False)
  • has_to_be_signed(self, also_in_draft=False)
  • message_post(self, **kwargs)
    @api.multi@api.returns('mail.message', <expr>)
  • name_get(self)
    @api.multi
  • onchange_partner_id(self)
    @api.multi@api.onchange('partner_id')
    Update the following fields when the partner is changed: - Pricelist - Payment terms - Invoice address - Delivery address
  • onchange_partner_id_warning(self)
    @api.onchange('partner_id')
  • onchange_partner_shipping_id(self)
    @api.multi@api.onchange('partner_shipping_id', 'partner_id', 'company_id')
    Trigger the change of fiscal position when the shipping address is modified.
  • payment_action_capture(self)
    @api.multi
  • payment_action_void(self)
    @api.multi
  • preview_sale_order(self)
    @api.multi
  • print_quotation(self)
    @api.multi
  • unlink(self)
    @api.multi

New fields (39)
  • analytic_line_ids One2many → account.analytic.line
    string='Analytic lines' args: 'account.analytic.line', 'so_line'
  • analytic_tag_ids Many2many → account.analytic.tag
    string='Analytic Tags' args: 'account.analytic.tag'
  • company_id Many2one
    readonly=True related='order_id.company_id' store=True string='Company'
  • currency_id Many2one
    depends=['order_id.currency_id'] readonly=True related='order_id.currency_id' store=True string='Currency'
  • customer_lead Float
    default=0.0 help='Number of days between the order confirmation and the shipping of the products to the customer' oldname='delay' required=True args: 'Delivery Lead Time'
  • discount Float
    default=0.0 digits=dp.get_precision('Discount') string='Discount (%)'
  • display_type Selection
    default=False help='Technical field for UX purpose.' args: [('line_section', 'Section'), ('line_note', 'Note')]
  • invoice_lines Many2many → account.invoice.line
    copy=False string='Invoice Lines' args: 'account.invoice.line', 'sale_order_line_invoice_rel', 'order_line_id', 'invoice_line_id'
  • invoice_status Selection
    compute='_compute_invoice_status' default='no' readonly=True store=True string='Invoice Status' args: [('upselling', 'Upselling Opportunity'), ('invoiced', 'Fully Invoiced'), ('to invoice', 'To Invoice'), ('no', 'Nothing to Invoice')]
  • is_downpayment Boolean
    help='Down payments are made when creating invoices from a sales order. They are not copied when duplicating a sales order.' string='Is a down payment'
  • is_expense Boolean
    help='Is true if the sales order line comes from an expense or a vendor bills' args: 'Is expense'
  • name Text
    required=True string='Description'
  • order_id Many2one → sale.order
    copy=False index=True ondelete='cascade' required=True string='Order Reference' args: 'sale.order'
  • order_partner_id Many2one
    readonly=False related='order_id.partner_id' store=True string='Customer'
  • price_reduce Float
    compute='_get_price_reduce' digits=dp.get_precision('Product Price') readonly=True store=True string='Price Reduce'
  • price_reduce_taxexcl Monetary
    compute='_get_price_reduce_notax' readonly=True store=True string='Price Reduce Tax excl'
  • price_reduce_taxinc Monetary
    compute='_get_price_reduce_tax' readonly=True store=True string='Price Reduce Tax inc'
  • price_subtotal Monetary
    compute='_compute_amount' readonly=True store=True string='Subtotal'
  • price_tax Float
    compute='_compute_amount' readonly=True store=True string='Total Tax'
  • price_total Monetary
    compute='_compute_amount' readonly=True store=True string='Total'
  • price_unit Float
    default=0.0 digits=dp.get_precision('Product Price') required=True args: 'Unit Price'
  • product_custom_attribute_value_ids One2many → product.attribute.custom.value
    copy=True string='User entered custom product attribute values' args: 'product.attribute.custom.value', 'sale_order_line_id'
  • product_id Many2one → product.product
    change_default=True domain=[('sale_ok', '=', True)] ondelete='restrict' string='Product' args: 'product.product'
  • product_image Binary
    readonly=False related='product_id.image' store=False args: 'Product Image'
  • product_no_variant_attribute_value_ids Many2many → product.template.attribute.value
    string='Product attribute values that do not create variants' args: 'product.template.attribute.value'
  • product_uom Many2one → uom.uom
    string='Unit of Measure' args: 'uom.uom'
  • product_uom_qty Float
    default=1.0 digits=dp.get_precision('Product Unit of Measure') required=True string='Ordered Quantity'
  • product_updatable Boolean
    compute='_compute_product_updatable' default=True readonly=True string='Can Edit Product'
  • qty_delivered Float
    compute='_compute_qty_delivered' compute_sudo=True copy=False default=0.0 digits=dp.get_precision('Product Unit of Measure') inverse='_inverse_qty_delivered' store=True args: 'Delivered Quantity'
  • qty_delivered_manual Float
    copy=False default=0.0 digits=dp.get_precision('Product Unit of Measure') args: 'Delivered Manually'
  • qty_delivered_method Selection
    compute='_compute_qty_delivered_method' compute_sudo=True help='According to product configuration, the delivered quantity can be automatically computed by mechanism :\n - Manual: the quantity is set manually on the line\n - Analytic From expenses: the quantity is the quantity sum from posted expenses\n - Timesheet: the quantity is the sum of hours recorded on tasks linked to this sale line\n - Stock Moves: the quantity comes from confirmed pickings\n' readonly=True store=True string='Method to update delivered qty' args: [('manual', 'Manual'), ('analytic', 'Analytic From Expenses')]
  • qty_invoiced Float
    compute='_get_invoice_qty' compute_sudo=True digits=dp.get_precision('Product Unit of Measure') readonly=True store=True string='Invoiced Quantity'
  • qty_to_invoice Float
    compute='_get_to_invoice_qty' digits=dp.get_precision('Product Unit of Measure') readonly=True store=True string='To Invoice Quantity'
  • salesman_id Many2one
    readonly=True related='order_id.user_id' store=True string='Salesperson'
  • sequence Integer
    default=10 string='Sequence'
  • state Selection
    copy=False default='draft' readonly=True related='order_id.state' store=True string='Order Status' args: [('draft', 'Quotation'), ('sent', 'Quotation Sent'), ('sale', 'Sales Order'), ('done', 'Done'), ('cancel', 'Cancelled')]
  • tax_id Many2many → account.tax
    domain=['|', ('active', '=', False), ('active', '=', True)] string='Taxes' args: 'account.tax'
  • untaxed_amount_invoiced Monetary
    compute='_compute_untaxed_amount_invoiced' compute_sudo=True store=True args: 'Untaxed Invoiced Amount'
  • untaxed_amount_to_invoice Monetary
    compute='_compute_untaxed_amount_to_invoice' compute_sudo=True store=True args: 'Untaxed Amount To Invoice'
Public methods (9)
  • create(self, vals_list)
    @api.model_create_multi
  • get_sale_order_line_multiline_description_sale(self, product)
    Compute a default multiline description for this sales order line. This method exists so it can be overridden in other modules to change how the default name is computed. In general only the product is used to compute the name, and this method would not be necessary (we could directly override the method in product). BUT in event_sale we need to know specifically the sales order line as well as the product to generate the name: the product is not sufficient because we also need to know the event_id and the event_ticket_id (both which belong to the sale order line).
  • invoice_line_create(self, invoice_id, qty)
    @api.multi
    Create an invoice line. The quantity to invoice can be positive (invoice) or negative (refund). .. deprecated:: 12.0 Replaced by :func:`invoice_line_create_vals` which can be used for creating `account.invoice.line` records in batch :param invoice_id: integer :param qty: float quantity to invoice :returns recordset of account.invoice.line created
  • invoice_line_create_vals(self, invoice_id, qty)
    Create an invoice line. The quantity to invoice can be positive (invoice) or negative (refund). :param invoice_id: integer :param qty: float quantity to invoice :returns list of dict containing creation values for account.invoice.line records
  • name_get(self)
    @api.multi
  • product_id_change(self)
    @api.multi@api.onchange('product_id')
  • product_uom_change(self)
    @api.onchange('product_uom', 'product_uom_qty')
  • unlink(self)
    @api.multi
  • write(self, values)
    @api.multi

New fields (1)
  • payment_method Selection
    default=_get_default_payment_method args: [('digital_signature', 'Sign online'), ('paypal', 'Pay with PayPal'), ('stripe', 'Pay with credit card (via Stripe)'), ('other', 'Pay with another payment acquirer'), ('manual', 'Custom payment instructions')]
Public methods (1)
  • add_payment_methods(self, *args, **kwargs)
    @api.multi

New fields (2)
  • pricelist_id Many2one → product.pricelist
    readonly=True args: 'product.pricelist', 'Pricelist'
  • product_template_id Many2one → product.template
    domain=[('sale_ok', '=', True), '|', ('attribute_line_ids.value_ids', '!=', False), ('optional_product_ids', '!=', False)] required=True string='Product' args: 'product.template'
Public methods (0)

No public methods.

New fields (30)
  • analytic_account_id Many2one → account.analytic.account
    readonly=True args: 'account.analytic.account', 'Analytic Account'
  • categ_id Many2one → product.category
    readonly=True args: 'product.category', 'Product Category'
  • commercial_partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Customer Entity'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • confirmation_date Datetime
    readonly=True args: 'Confirmation Date'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Customer Country'
  • date Datetime
    readonly=True args: 'Order Date'
  • discount Float
    readonly=True args: 'Discount %'
  • discount_amount Float
    readonly=True args: 'Discount Amount'
  • name Char
    readonly=True args: 'Order Reference'
  • nbr Integer
    readonly=True args: '# of Lines'
  • order_id Many2one → sale.order
    readonly=True args: 'sale.order', 'Order #'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Customer'
  • price_subtotal Float
    readonly=True args: 'Untaxed Total'
  • price_total Float
    readonly=True args: 'Total'
  • pricelist_id Many2one → product.pricelist
    readonly=True args: 'product.pricelist', 'Pricelist'
  • product_id Many2one → product.product
    readonly=True args: 'product.product', 'Product Variant'
  • product_tmpl_id Many2one → product.template
    readonly=True args: 'product.template', 'Product'
  • product_uom Many2one → uom.uom
    readonly=True args: 'uom.uom', 'Unit of Measure'
  • product_uom_qty Float
    readonly=True args: 'Qty Ordered'
  • qty_delivered Float
    readonly=True args: 'Qty Delivered'
  • qty_invoiced Float
    readonly=True args: 'Qty Invoiced'
  • qty_to_invoice Float
    readonly=True args: 'Qty To Invoice'
  • state Selection
    readonly=True string='Status' args: [('draft', 'Draft Quotation'), ('sent', 'Quotation Sent'), ('sale', 'Sales Order'), ('done', 'Sales Done'), ('cancel', 'Cancelled')]
  • team_id Many2one → crm.team
    oldname='section_id' readonly=True args: 'crm.team', 'Sales Team'
  • untaxed_amount_invoiced Float
    readonly=True args: 'Untaxed Amount Invoiced'
  • untaxed_amount_to_invoice Float
    readonly=True args: 'Untaxed Amount To Invoice'
  • user_id Many2one → res.users
    readonly=True args: 'res.users', 'Salesperson'
  • volume Float
    readonly=True args: 'Volume'
  • weight Float
    readonly=True args: 'Gross Weight'
Public methods (1)
  • init(self)
    @api.model_cr
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/11.0/sale
VERSION
VERSION 1.1
CATEGORY
CATEGORYSales
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Christophe Simonis, Xavier Morel, Goffin Simon, Simon Lejeune, Nicolas Martinelli, Nhomar Hernandez, Nicolas Lempereur, Jérome Maes, Richard Mathot, qdp-odoo, Géry Debongnie, Aaron Bohy, ged-odoo, Jeremy Kersten, GitHub, Lucas Perais (lpe), Damien Bouvy, Olivier Colson, Yannick Tivisse, qsm-odoo, Martin Geubelle, Odoo Online, Nicolas Seinlet, Pierre Masereel, Laurent Smet, Denis Vermylen (dve), DVE, jem-odoo, fwi-odoo, Adrien Dieudonne, len-odoo, Jorge Pinna Puissant, Nans Lefebvre, Denis Vermylen, Lucas Perais, amoyaux, fda-odoo, Adrian Torres, Rémi Rahir, Carlos Dauden, rar-odoo, Victor Feyens, Enric Tobella, david, Jose Suniaga [Vauxoo]
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:53:43
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - account
    - product
    - decimal_precision
    - analytic
    - web_planner
    - portal
    - http_routing
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module contains all the common features of Sales Management and eCommerce.
    

Code Analysis

Views touched (55)
XML IDNameModelTypeStatus
account_invoice_form Account Invoice account.invoice data Inherits account.invoice_form
account_invoice_groupby_inherit account.invoice.groupby account.invoice xpath Inherits account.view_account_invoice_filter
account_invoice_line_form account.invoice.line.form account.invoice.line data Inherits account.view_invoice_line_form
account_invoice_line_tree account.invoice.line.tree account.invoice.line data Inherits account.view_invoice_line_tree
account_invoice_supplier_form account.invoice.supplier.form account.invoice data Inherits account.invoice_supplier_form
assets_backend Sale backend assets ir.ui.view qweb Inherits sales_team.assets_backend
assets_frontend Sale frontend assets ir.ui.view qweb Inherits web.assets_frontend
crm_lead_partner_kanban_view res.partner.kanban.saleorder.inherit res.partner field Inherits base.res_partner_kanban_view
crm_team_salesteams_view_form crm.team.form crm.team xpath Inherits sales_team.crm_team_view_form
crm_team_salesteams_view_kanban crm.team.kanban crm.team data Inherits sales_team.crm_team_salesteams_view_kanban
invoice_form_inherit_sale account.invoice.form.inherit.sale account.invoice xpath Inherits account.invoice_form
portal_my_home_menu_sale Portal layout : sales menu entries ir.ui.view qweb Inherits portal.portal_layout
portal_my_home_sale Portal My Home : sales entries ir.ui.view qweb Inherits portal.portal_my_home
portal_my_orders My Sales Orders ir.ui.view qweb New
portal_my_quotations My Quotations ir.ui.view qweb New
portal_order_error Order error/warning display ir.ui.view qweb New
portal_order_page Sales Order ir.ui.view qweb New
portal_order_success Order success display ir.ui.view qweb New
product_form_view_sale_order_button product.product.sale.order product.product button Inherits product.product_normal_form_view
product_pricelist_view_form product.pricelist.form.inherit.product product.pricelist field Inherits product.product_pricelist_view
product_pricelist_view_kanban product.pricelist.kanban.inherit.product product.pricelist data Inherits product.product_pricelist_view_kanban
product_pricelist_view_tree product.pricelist.tree.inherit.product product.pricelist field Inherits product.product_pricelist_view_tree
product_template_form_view_invoice_policy product.template.invoice.policy product.template group Inherits product.product_template_form_view
product_template_form_view_sale_order_button product.template.sale.order.button product.template button Inherits product.product_template_only_form_view
qunit_suite sales_team_dashboard_tests ir.ui.view qweb Inherits web.qunit_suite
report_all_channels_sales_view_pivot report.all.channels.sales.pivot report.all.channels.sales pivot New
report_all_channels_sales_view_search report.all.channels.sales.search report.all.channels.sales search New
report_configuration_form_view report.configuration.form.view sale.layout_category form New
report_configuration_search_view report.configuration.search.view sale.layout_category search New
report_configuration_tree_view report.configuration.form.view sale.layout_category tree New
report_invoice_document_inherit_sale report_invoice_document_inherit_sale ir.ui.view qweb Inherits account.report_invoice_document
report_invoice_layouted report_invoice_layouted ir.ui.view qweb Inherits account.report_invoice_document
report_saleorder report_saleorder ir.ui.view qweb New
report_saleorder_document report_saleorder_document ir.ui.view qweb New
report_saleorder_pro_forma report_saleorder_pro_forma ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.sale res.config.settings xpath Inherits base.res_config_settings_view_form
res_partner_view_buttons res.partner.view.buttons res.partner button Inherits base.view_partner_form
sale_order_view_search_inherit_quotation sale.order.search.inherit.quotation sale.order xpath Inherits sale.view_sales_order_filter
sale_order_view_search_inherit_sale sale.order.search.inherit.sale sale.order xpath Inherits sale.view_sales_order_filter
view_account_invoice_report_search_inherit account.invoice.report.search.inherit account.invoice.report xpath Inherits account.view_account_invoice_report_search
view_order_form sale.order.form sale.order form New
view_order_form_editable_list sale.order.form.editable.list sale.order xpath Inherits sale.view_order_form
view_order_line_tree sale.order.line.tree sale.order.line tree New
view_order_product_graph sale.report.graph sale.report graph New
view_order_product_pivot sale.report.pivot sale.report pivot New
view_order_product_search sale.report.search sale.report search New
view_order_tree sale.order.tree sale.order tree New
view_quotation_tree sale.order.tree sale.order tree New
view_sale_advance_payment_inv Invoice Orders sale.advance.payment.inv form New
view_sale_order_calendar sale.order.calendar sale.order calendar New
view_sale_order_graph sale.order.graph sale.order graph New
view_sale_order_kanban sale.order.kanban sale.order kanban New
view_sale_order_pivot sale.order.pivot sale.order pivot New
view_sales_order_filter sale.order.list.select sale.order search New
view_sales_order_line_filter sale.order.line.select sale.order.line search New
Models touched (20)

New fields (1)
  • so_line Many2one → sale.order.line
    string='Sales Order Line' args: 'sale.order.line'
Public methods (3)
  • create(self, values)
    @api.model
  • unlink(self)
    @api.multi
  • write(self, values)
    @api.multi

New fields (3)
  • comment Text
    default=_default_comment
  • partner_shipping_id Many2one → res.partner
    help='Delivery address for current invoice.' readonly=True states={'draft': [('readonly', False)]} string='Delivery Address' args: 'res.partner'
  • team_id Many2one → crm.team
    default=_get_default_team oldname='section_id' string='Sales Channel' args: 'crm.team'
Public methods (3)
  • action_invoice_paid(self)
    @api.multi
  • get_delivery_partner_id(self)
    @api.multi
  • order_lines_layouted(self)
    @api.multi
    Returns this sales order lines ordered by sale_layout_category sequence. Used to render the report.

New fields (3)
  • layout_category_id Many2one → sale.layout_category
    string='Section' args: 'sale.layout_category'
  • layout_category_sequence Integer
    string='Layout Sequence'
  • sale_line_ids Many2many → sale.order.line
    copy=False readonly=True string='Sales Order Lines' args: 'sale.order.line', 'sale_order_line_invoice_rel', 'invoice_line_id', 'order_line_id'
Public methods (0)

No public methods.

New fields (1)
  • team_id Many2one → crm.team
    string='Sales Channel' args: 'crm.team'
Public methods (0)

No public methods.

New fields (8)
  • dashboard_graph_model Selection
    selection_add=[('sale.report', 'Sales'), ('account.invoice.report', 'Invoices')]
  • invoiced Integer
    compute='_compute_invoiced' help='Invoice revenue for the current month. This is the amount the sales channel has invoiced this month. It is used to compute the progression ratio of the current and target revenue on the kanban view.' readonly=True string='Invoiced This Month'
  • invoiced_target Integer
    help='Target of invoice revenue for the current month. This is the amount the sales channel estimates to be able to invoice this month.' string='Invoicing Target'
  • quotations_amount Integer
    compute='_compute_quotations_to_invoice' readonly=True string='Amount of quotations to invoice'
  • quotations_count Integer
    compute='_compute_quotations_to_invoice' readonly=True string='Number of quotations to invoice'
  • sales_to_invoice_count Integer
    compute='_compute_sales_to_invoice' readonly=True string='Number of sales to invoice'
  • use_invoices Boolean
    help='Check this box to set an invoicing target for this sales channel.' args: 'Set Invoicing Target'
  • use_quotations Boolean
    help='Check this box if you send quotations to your customers rather than confirming orders straight away. This will add specific action buttons to your dashboard.' string='Quotations'
Public methods (2)
  • action_primary_channel_button(self)
  • update_invoiced_target(self, value)
    @api.multi

New fields (0)

No new fields.

Public methods (1)
  • unlink(self)

New fields (0)

No new fields.

Public methods (1)
  • send_mail(self, auto_commit=False)
    @api.multi

New fields (1)
  • discount_policy Selection
    default='with_discount' args: [('with_discount', 'Discount included in the price'), ('without_discount', 'Show public price & discount to the customer')]
Public methods (0)

No public methods.

New fields (1)
  • sales_count Integer
    compute='_sales_count' string='# Sales'
Public methods (0)

No public methods.

New fields (6)
  • expense_policy Selection
    default='no' string='Re-Invoice Expenses' args: [('no', 'No'), ('cost', 'At cost'), ('sales_price', 'Sales price')]
  • invoice_policy Selection
    default='order' help='Ordered Quantity: Invoice based on the quantity the customer ordered.\nDelivered Quantity: Invoiced based on the quantity the vendor delivered (time or deliveries).' string='Invoicing Policy' args: [('order', 'Ordered quantities'), ('delivery', 'Delivered quantities')]
  • sale_line_warn Selection
    default='no-message' help=WARNING_HELP required=True args: WARNING_MESSAGE, 'Sales Order Line'
  • sale_line_warn_msg Text
    args: 'Message for Sales Order Line'
  • sales_count Integer
    compute='_sales_count' string='# Sales'
  • service_type Selection
    default='manual' help='Manually set quantities on order: Invoice based on the manually entered quantity, without creating an analytic account.\nTimesheets on contract: Invoice based on the tracked hours on the related timesheet.\nCreate a task and track hours: Create a task on the sales order validation and track the work hours.' oldname='track_service' string='Track Service' args: [('manual', 'Manually set quantities on order')]
Public methods (1)
  • action_view_sales(self)
    @api.multi

New fields (15)
  • analytic_account_id Many2one → account.analytic.account
    readonly=True args: 'account.analytic.account', 'Analytic Account'
  • categ_id Many2one → product.category
    readonly=True args: 'product.category', 'Product Category'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Partner Country'
  • date_order Datetime
    readonly=True string='Date Order'
  • name Char
    readonly=True args: 'Order Reference'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Partner'
  • price_subtotal Float
    readonly=True string='Price Subtotal'
  • price_total Float
    readonly=True args: 'Total'
  • pricelist_id Many2one → product.pricelist
    readonly=True args: 'product.pricelist', 'Pricelist'
  • product_id Many2one → product.product
    readonly=True string='Product' args: 'product.product'
  • product_qty Float
    readonly=True args: 'Product Quantity'
  • product_tmpl_id Many2one → product.template
    readonly=True args: 'product.template', 'Product Template'
  • team_id Many2one → crm.team
    readonly=True args: 'crm.team', 'Sales Channel'
  • user_id Many2one → res.users
    readonly=True args: 'res.users', 'Salesperson'
Public methods (2)
  • get_main_request(self)
  • init(self)
    @api.model_cr

New fields (0)

No new fields.

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

New fields (1)
  • sale_note Text
    string='Default Terms and Conditions' translate=True
Public methods (0)

No public methods.

New fields (31)
  • auth_signup_uninvited Selection
    string='Customer Account' args: [('b2b', 'On invitation (B2B)'), ('b2c', 'Free sign up (B2C)')]
  • auto_done_setting Boolean
    args: 'Lock Confirmed Orders'
  • default_deposit_product_id Many2one → product.product
    domain="[('type', '=', 'service')]" help='Default product used for payment advances' oldname='deposit_product_id_setting' args: 'product.product', 'Deposit Product'
  • default_invoice_policy Selection
    default='order' default_model='product.template' args: [('order', 'Invoice what is ordered'), ('delivery', 'Invoice what is delivered')], 'Invoicing Policy'
  • group_discount_per_so_line Boolean
    implied_group='sale.group_discount_per_so_line' args: 'Discounts'
  • group_proforma_sales Boolean
    help='Allows you to send pro-forma invoice.' implied_group='sale.group_proforma_sales' string='Pro-Forma Invoice'
  • group_sale_delivery_address Boolean
    implied_group='sale.group_delivery_invoice_address' args: 'Customer Addresses'
  • group_sale_layout Boolean
    implied_group='sale.group_sale_layout' args: 'Sections on Sales Orders'
  • group_show_price_subtotal Boolean
    group='base.group_portal,base.group_user,base.group_public' implied_group='sale.group_show_price_subtotal' args: 'Show subtotal'
  • group_show_price_total Boolean
    group='base.group_portal,base.group_user,base.group_public' implied_group='sale.group_show_price_total' args: 'Show total'
  • group_warning_sale Boolean
    implied_group='sale.group_warning_sale' args: 'Warnings'
  • module_delivery Boolean
    args: 'Shipping Costs'
  • module_delivery_bpost Boolean
    args: 'bpost'
  • module_delivery_dhl Boolean
    args: 'DHL'
  • module_delivery_fedex Boolean
    args: 'FedEx'
  • module_delivery_ups Boolean
    args: 'UPS'
  • module_delivery_usps Boolean
    args: 'USPS'
  • module_product_email_template Boolean
    args: 'Specific Email'
  • module_sale_coupon Boolean
    args: 'Coupons & Promotions'
  • module_sale_margin Boolean
    args: 'Margins'
  • module_sale_payment Boolean
    help='Technical field implied by user choice of online_confirmation' args: 'Online Signature & Payment'
  • module_website_quote Boolean
    args: 'Quotations Templates'
  • module_website_sale_digital Boolean
    args: 'Sell digital products - provide downloadable content on your customer portal'
  • multi_sales_price Boolean
    args: 'Multiple Sales Prices per Product'
  • multi_sales_price_method Selection
    default='percentage' string='Pricelists' args: [('percentage', 'Multiple prices per product (e.g. customer segments, currencies)'), ('formula', 'Prices computed from formulas (discounts, margins, roundings)')]
  • portal_confirmation Boolean
    args: 'Online Signature & Payment'
  • portal_confirmation_options Selection
    string='Online Signature & Payment options' args: [('sign', 'Signature'), ('pay', 'Payment')]
  • sale_note Text
    related='company_id.sale_note' string='Terms & Conditions'
  • sale_pricelist_setting Selection
    string='Pricelists' args: [('fixed', 'A single sales price per product'), ('percentage', 'Multiple prices per product (e.g. customer segments, currencies)'), ('formula', 'Price computed from formulas (discounts, margins, roundings)')]
  • sale_show_tax Selection
    default='subtotal' required=True string='Tax Display' args: [('subtotal', 'Tax-Excluded Prices'), ('total', 'Tax-Included Prices')]
  • use_sale_note Boolean
    oldname='default_use_sale_note' string='Default Terms & Conditions'
Public methods (2)
  • get_values(self)
    @api.model
  • set_values(self)
    @api.multi

New fields (4)
  • sale_order_count Integer
    compute='_compute_sale_order_count' string='# of Sales Order'
  • sale_order_ids One2many → sale.order
    args: 'sale.order', 'partner_id', 'Sales Order'
  • sale_warn Selection
    default='no-message' help=WARNING_HELP required=True args: WARNING_MESSAGE, 'Sales Order'
  • sale_warn_msg Text
    args: 'Message for Sales Order'
Public methods (0)

No public methods.

New fields (6)
  • advance_payment_method Selection
    default=_get_advance_payment_method required=True string='What do you want to invoice?' args: [('delivered', 'Invoiceable lines'), ('all', 'Invoiceable lines (deduct down payments)'), ('percentage', 'Down payment (percentage)'), ('fixed', 'Down payment (fixed amount)')]
  • amount Float
    digits=dp.get_precision('Account') help='The amount to be invoiced in advance, taxes excluded.' args: 'Down Payment Amount'
  • count Integer
    default=_count string='# of Orders'
  • deposit_account_id Many2one → account.account
    default=_default_deposit_account_id domain=[('deprecated', '=', False)] help='Account used for deposits' string='Income Account' args: 'account.account'
  • deposit_taxes_id Many2many → account.tax
    default=_default_deposit_taxes_id help='Taxes used for deposits' string='Customer Taxes' args: 'account.tax'
  • product_id Many2one → product.product
    default=_default_product_id domain=[('type', '=', 'service')] string='Down Payment Product' args: 'product.product'
Public methods (2)
  • create_invoices(self)
    @api.multi
  • onchange_advance_payment_method(self)
    @api.onchange('advance_payment_method')

New fields (4)
  • name Char
    required=True translate=True args: 'Name'
  • pagebreak Boolean
    args: 'Add pagebreak'
  • sequence Integer
    default=10 required=True args: 'Sequence'
  • subtotal Boolean
    default=True args: 'Add subtotal'
Public methods (0)

No public methods.

New fields (30)
  • access_token Char
    copy=False default=_get_default_access_token args: 'Security Token'
  • amount_tax Monetary
    compute='_amount_all' readonly=True store=True string='Taxes'
  • amount_total Monetary
    compute='_amount_all' readonly=True store=True string='Total' track_visibility='always'
  • amount_untaxed Monetary
    compute='_amount_all' readonly=True store=True string='Untaxed Amount' track_visibility='onchange'
  • analytic_account_id Many2one → account.analytic.account
    copy=False help='The analytic account related to a sales order.' oldname='project_id' readonly=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} args: 'account.analytic.account', 'Analytic Account'
  • client_order_ref Char
    copy=False string='Customer Reference'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • confirmation_date Datetime
    copy=False help='Date on which the sales order is confirmed.' index=True oldname='date_confirm' readonly=True string='Confirmation Date'
  • create_date Datetime
    help='Date on which sales order is created.' index=True readonly=True string='Creation Date'
  • currency_id Many2one → res.currency
    readonly=True related='pricelist_id.currency_id' required=True string='Currency' args: 'res.currency'
  • date_order Datetime
    copy=False default=fields.Datetime.now index=True readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Order Date'
  • fiscal_position_id Many2one → account.fiscal.position
    oldname='fiscal_position' string='Fiscal Position' args: 'account.fiscal.position'
  • invoice_count Integer
    compute='_get_invoiced' readonly=True string='# of Invoices'
  • invoice_ids Many2many → account.invoice
    compute='_get_invoiced' copy=False readonly=True string='Invoices' args: 'account.invoice'
  • invoice_status Selection
    compute='_get_invoiced' readonly=True store=True string='Invoice Status' args: [('upselling', 'Upselling Opportunity'), ('invoiced', 'Fully Invoiced'), ('to invoice', 'To Invoice'), ('no', 'Nothing to Invoice')]
  • is_expired Boolean
    compute='_compute_is_expired' string='Is expired'
  • name Char
    copy=False default=<expr> index=True readonly=True required=True states={'draft': [('readonly', False)]} string='Order Reference'
  • note Text
    default=_default_note args: 'Terms and conditions'
  • order_line One2many → sale.order.line
    auto_join=True copy=True states={'cancel': [('readonly', True)], 'done': [('readonly', True)]} string='Order Lines' args: 'sale.order.line', 'order_id'
  • origin Char
    help='Reference of the document that generated this sales order request.' string='Source Document'
  • partner_id Many2one → res.partner
    change_default=True index=True readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Customer' track_visibility='always' args: 'res.partner'
  • partner_invoice_id Many2one → res.partner
    help='Invoice address for current sales order.' readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Invoice Address' args: 'res.partner'
  • partner_shipping_id Many2one → res.partner
    help='Delivery address for current sales order.' readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Delivery Address' args: 'res.partner'
  • payment_term_id Many2one → account.payment.term
    oldname='payment_term' string='Payment Terms' args: 'account.payment.term'
  • pricelist_id Many2one → product.pricelist
    help='Pricelist for current sales order.' readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Pricelist' args: 'product.pricelist'
  • product_id Many2one → product.product
    related='order_line.product_id' string='Product' args: 'product.product'
  • state Selection
    copy=False default='draft' index=True readonly=True string='Status' track_visibility='onchange' args: [('draft', 'Quotation'), ('sent', 'Quotation Sent'), ('sale', 'Sales Order'), ('done', 'Locked'), ('cancel', 'Cancelled')]
  • team_id Many2one → crm.team
    change_default=True default=_get_default_team oldname='section_id' args: 'crm.team', 'Sales Channel'
  • user_id Many2one → res.users
    default=<expr> index=True string='Salesperson' track_visibility='onchange' args: 'res.users'
  • validity_date Date
    copy=False help='Manually set the expiration date of your quotation (offer), or it will set the date automatically based on the template if online quotation is installed.' readonly=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Expiration Date'
Public methods (23)
  • action_cancel(self)
    @api.multi
  • action_confirm(self)
    @api.multi
  • action_done(self)
    @api.multi
  • action_draft(self)
    @api.multi
  • action_invoice_create(self, grouped=False, final=False)
    @api.multi
    Create the invoice associated to the SO. :param grouped: if True, invoices are grouped by SO id. If False, invoices are grouped by (partner_invoice_id, currency) :param final: if True, refunds will be generated if necessary :returns: list of created invoices
  • action_quotation_send(self)
    @api.multi
    This function opens a window to compose an email, with the edi sale template message loaded by default
  • action_unlock(self)
    @api.multi
  • action_view_invoice(self)
    @api.multi
  • copy_data(self, default=None)
    @api.multi
  • create(self, vals)
    @api.model
  • force_quotation_send(self)
    @api.multi
  • get_access_action(self, access_uid=None)
    @api.multi
    Instead of the classic form view, redirect to the online order for portal users or if force_website=True in the context.
  • get_empty_list_help(self, help)
    @api.model
  • get_mail_url(self)
  • get_portal_confirmation_action(self)
  • name_get(self)
    @api.multi
  • name_search(self, name='', args=None, operator='ilike', limit=100)
    @api.model
  • onchange_partner_id(self)
    @api.multi@api.onchange('partner_id')
    Update the following fields when the partner is changed: - Pricelist - Payment terms - Invoice address - Delivery address
  • onchange_partner_id_warning(self)
    @api.onchange('partner_id')
  • onchange_partner_shipping_id(self)
    @api.multi@api.onchange('partner_shipping_id', 'partner_id')
    Trigger the change of fiscal position when the shipping address is modified.
  • order_lines_layouted(self)
    @api.multi
    Returns this order lines classified by sale_layout_category and separated in pages according to the category pagebreaks. Used to render the report.
  • print_quotation(self)
    @api.multi
  • unlink(self)
    @api.multi

New fields (35)
  • amt_invoiced Monetary
    compute='_compute_invoice_amount' compute_sudo=True store=True string='Amount Invoiced'
  • amt_to_invoice Monetary
    compute='_compute_invoice_amount' compute_sudo=True store=True string='Amount To Invoice'
  • analytic_tag_ids Many2many → account.analytic.tag
    string='Analytic Tags' args: 'account.analytic.tag'
  • company_id Many2one
    readonly=True related='order_id.company_id' store=True string='Company'
  • currency_id Many2one
    readonly=True related='order_id.currency_id' store=True string='Currency'
  • customer_lead Float
    default=0.0 help='Number of days between the order confirmation and the shipping of the products to the customer' oldname='delay' required=True args: 'Delivery Lead Time'
  • discount Float
    default=0.0 digits=dp.get_precision('Discount') string='Discount (%)'
  • invoice_lines Many2many → account.invoice.line
    copy=False string='Invoice Lines' args: 'account.invoice.line', 'sale_order_line_invoice_rel', 'order_line_id', 'invoice_line_id'
  • invoice_status Selection
    compute='_compute_invoice_status' default='no' readonly=True store=True string='Invoice Status' args: [('upselling', 'Upselling Opportunity'), ('invoiced', 'Fully Invoiced'), ('to invoice', 'To Invoice'), ('no', 'Nothing to Invoice')]
  • is_downpayment Boolean
    help='Down payments are made when creating invoices from a sales order. They are not copied when duplicating a sales order.' string='Is a down payment'
  • layout_category_id Many2one → sale.layout_category
    string='Section' args: 'sale.layout_category'
  • layout_category_sequence Integer
    string='Layout Sequence'
  • name Text
    required=True string='Description'
  • order_id Many2one → sale.order
    copy=False index=True ondelete='cascade' required=True string='Order Reference' args: 'sale.order'
  • order_partner_id Many2one
    related='order_id.partner_id' store=True string='Customer'
  • price_reduce Float
    compute='_get_price_reduce' digits=dp.get_precision('Product Price') readonly=True store=True string='Price Reduce'
  • price_reduce_taxexcl Monetary
    compute='_get_price_reduce_notax' readonly=True store=True string='Price Reduce Tax excl'
  • price_reduce_taxinc Monetary
    compute='_get_price_reduce_tax' readonly=True store=True string='Price Reduce Tax inc'
  • price_subtotal Monetary
    compute='_compute_amount' readonly=True store=True string='Subtotal'
  • price_tax Float
    compute='_compute_amount' readonly=True store=True string='Taxes'
  • price_total Monetary
    compute='_compute_amount' readonly=True store=True string='Total'
  • price_unit Float
    default=0.0 digits=dp.get_precision('Product Price') required=True args: 'Unit Price'
  • product_id Many2one → product.product
    change_default=True domain=[('sale_ok', '=', True)] ondelete='restrict' required=True string='Product' args: 'product.product'
  • product_image Binary
    related='product_id.image' store=False args: 'Product Image'
  • product_uom Many2one → product.uom
    required=True string='Unit of Measure' args: 'product.uom'
  • product_uom_qty Float
    default=1.0 digits=dp.get_precision('Product Unit of Measure') required=True string='Quantity'
  • product_updatable Boolean
    compute='_compute_product_updatable' default=True readonly=True string='Can Edit Product'
  • qty_delivered Float
    copy=False default=0.0 digits=dp.get_precision('Product Unit of Measure') string='Delivered'
  • qty_delivered_updateable Boolean
    compute='_compute_qty_delivered_updateable' default=True readonly=True string='Can Edit Delivered'
  • qty_invoiced Float
    compute='_get_invoice_qty' digits=dp.get_precision('Product Unit of Measure') readonly=True store=True string='Invoiced'
  • qty_to_invoice Float
    compute='_get_to_invoice_qty' digits=dp.get_precision('Product Unit of Measure') readonly=True store=True string='To Invoice'
  • salesman_id Many2one
    readonly=True related='order_id.user_id' store=True string='Salesperson'
  • sequence Integer
    default=10 string='Sequence'
  • state Selection
    copy=False default='draft' readonly=True related='order_id.state' store=True string='Order Status' args: [('draft', 'Quotation'), ('sent', 'Quotation Sent'), ('sale', 'Sales Order'), ('done', 'Done'), ('cancel', 'Cancelled')]
  • tax_id Many2many → account.tax
    domain=['|', ('active', '=', False), ('active', '=', True)] string='Taxes' args: 'account.tax'
Public methods (8)
  • create(self, values)
    @api.model
  • invoice_line_create(self, invoice_id, qty)
    @api.multi
    Create an invoice line. The quantity to invoice can be positive (invoice) or negative (refund). :param invoice_id: integer :param qty: float quantity to invoice :returns recordset of account.invoice.line created
  • name_get(self)
    @api.multi
  • name_search(self, name='', args=None, operator='ilike', limit=100)
    @api.model
  • product_id_change(self)
    @api.multi@api.onchange('product_id')
  • product_uom_change(self)
    @api.onchange('product_uom', 'product_uom_qty')
  • unlink(self)
    @api.multi
  • write(self, values)
    @api.multi

New fields (27)
  • amt_invoiced Float
    readonly=True args: 'Amount Invoiced'
  • amt_to_invoice Float
    readonly=True args: 'Amount To Invoice'
  • analytic_account_id Many2one → account.analytic.account
    readonly=True args: 'account.analytic.account', 'Analytic Account'
  • categ_id Many2one → product.category
    readonly=True args: 'product.category', 'Product Category'
  • commercial_partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Commercial Entity'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • confirmation_date Datetime
    readonly=True args: 'Confirmation Date'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Partner Country'
  • date Datetime
    readonly=True args: 'Date Order'
  • name Char
    readonly=True args: 'Order Reference'
  • nbr Integer
    readonly=True args: '# of Lines'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Partner'
  • price_subtotal Float
    readonly=True args: 'Untaxed Total'
  • price_total Float
    readonly=True args: 'Total'
  • pricelist_id Many2one → product.pricelist
    readonly=True args: 'product.pricelist', 'Pricelist'
  • product_id Many2one → product.product
    readonly=True args: 'product.product', 'Product'
  • product_tmpl_id Many2one → product.template
    readonly=True args: 'product.template', 'Product Template'
  • product_uom Many2one → product.uom
    readonly=True args: 'product.uom', 'Unit of Measure'
  • product_uom_qty Float
    readonly=True args: 'Qty Ordered'
  • qty_delivered Float
    readonly=True args: 'Qty Delivered'
  • qty_invoiced Float
    readonly=True args: 'Qty Invoiced'
  • qty_to_invoice Float
    readonly=True args: 'Qty To Invoice'
  • state Selection
    readonly=True string='Status' args: [('draft', 'Draft Quotation'), ('sent', 'Quotation Sent'), ('sale', 'Sales Order'), ('done', 'Sales Done'), ('cancel', 'Cancelled')]
  • team_id Many2one → crm.team
    oldname='section_id' readonly=True args: 'crm.team', 'Sales Channel'
  • user_id Many2one → res.users
    readonly=True args: 'res.users', 'Salesperson'
  • volume Float
    readonly=True args: 'Volume'
  • weight Float
    readonly=True args: 'Gross Weight'
Public methods (1)
  • init(self)
    @api.model_cr
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/10.0/sale
VERSION
VERSION 1.0
CATEGORY
CATEGORYSales
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Christophe Matthieu, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Josse Colpaert, Denis Ledoux, Christophe Simonis, David Monjoie, Goffin Simon, Nicolas Martinelli, Nicolas Lempereur, Julien Legros, Richard Mathot, qdp-odoo, Aaron Bohy, Jeremy Kersten, Lucas Perais (lpe), Damien Bouvy, Yannick Tivisse, qsm-odoo, Martin Geubelle, Denis Vermylen (dve), len-odoo, Denis Vermylen, Moens Alexandre
WEBSITE
WEBSITEhttps://www.odoo.com/page/crm
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:50:48
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sales_team
    - base
    - mail
    - base_setup
    - web_kanban
    - web
    - bus
    - web_tour
    - account
    - product
    - decimal_precision
    - report
    - analytic
    - web_planner
    - procurement
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage sales quotations and orders
==================================

This application allows you to manage your sales goals in an effective and efficient manner by keeping track of all sales orders and history.

It handles the full sales workflow:

* **Quotation** -> **Sales order** -> **Invoice**

Preferences (only with Warehouse Management installed)
------------------------------------------------------

If you also installed the Warehouse Management, you can deal with the following preferences:

* Shipping: Choice of delivery at once or partial delivery
* Invoicing: choose how invoices will be paid
* Incoterms: International Commercial terms

You can choose flexible invoicing methods:

* *On Demand*: Invoices are created manually from Sales Orders when needed
* *On Delivery Order*: Invoices are generated from picking (delivery)
* *Before Delivery*: A Draft invoice is created and must be paid before delivery

With this module you can personnalize the sale order and invoice report with
categories, subtotals or page-breaks.

The Dashboard for the Sales Manager will include
------------------------------------------------
* My Quotations
* Monthly Turnover (Graph)
    

Code Analysis

Views touched (42)
XML IDNameModelTypeStatus
account_invoice_form Account Invoice account.invoice data Inherits account.invoice_form
account_invoice_groupby_inherit account.invoice.groupby account.invoice xpath Inherits account.view_account_invoice_filter
account_invoice_line_form account.invoice.line.form account.invoice.line data Inherits account.view_invoice_line_form
account_invoice_line_tree account.invoice.line.tree account.invoice.line data Inherits account.view_invoice_line_tree
account_invoice_supplier_form account.invoice.supplier.form account.invoice data Inherits account.invoice_supplier_form
assets_backend project assets ir.ui.view qweb Inherits web.assets_backend
crm_lead_partner_kanban_view res.partner.kanban.saleorder.inherit res.partner field Inherits base.res_partner_kanban_view
crm_team_salesteams_view_form crm.team.form crm.team xpath Inherits sales_team.crm_team_view_form
crm_team_salesteams_view_kanban crm.team.kanban crm.team data Inherits sales_team.crm_team_salesteams_view_kanban
product_form_view_sale_order_button product.product.sale.order product.product div Inherits product.product_normal_form_view
product_pricelist_view_form product.pricelist.form.inherit.product product.pricelist field Inherits product.product_pricelist_view
product_pricelist_view_tree product.pricelist.tree.inherit.product product.pricelist field Inherits product.product_pricelist_view_tree
product_template_form_view_invoice_policy product.template.invoice.policy product.template page Inherits product.product_template_form_view
product_template_form_view_sale_order_button product.template.sale.order.button product.template div Inherits product.product_template_only_form_view
report_configuration_form_view report.configuration.form.view sale.layout_category form New
report_configuration_search_view report.configuration.search.view sale.layout_category search New
report_configuration_tree_view report.configuration.form.view sale.layout_category tree New
report_invoice_document_inherit_sale report_invoice_document_inherit_sale ir.ui.view qweb Inherits account.report_invoice_document
report_invoice_layouted report_invoice_layouted ir.ui.view qweb Inherits account.report_invoice_document
report_saleorder report_saleorder ir.ui.view qweb New
report_saleorder_document report_saleorder_document ir.ui.view qweb New
res_partner_view_buttons res.partner.view.buttons res.partner div Inherits base.view_partner_form
sale_order_view_search_inherit_quotation sale.order.search.inherit.quotation sale.order xpath Inherits sale.view_sales_order_filter
sale_order_view_search_inherit_sale sale.order.search.inherit.sale sale.order xpath Inherits sale.view_sales_order_filter
view_account_config account settings account.config.settings separator Inherits account.view_account_config_settings
view_account_invoice_report_search_inherit account.invoice.report.search.inherit account.invoice.report xpath Inherits account.view_account_invoice_report_search
view_order_form sale.order.form sale.order form New
view_order_form_editable_list sale.order.form.editable.list sale.order xpath Inherits sale.view_order_form
view_order_line_tree sale.order.line.tree sale.order.line tree New
view_order_product_graph sale.report.graph sale.report graph New
view_order_product_pivot sale.report.pivot sale.report pivot New
view_order_product_search sale.report.search sale.report search New
view_order_tree sale.order.tree sale.order tree New
view_quotation_tree sale.order.tree sale.order tree New
view_sale_advance_payment_inv Invoice Orders sale.advance.payment.inv form New
view_sale_order_calendar sale.order.calendar sale.order calendar New
view_sale_order_graph sale.order.graph sale.order graph New
view_sale_order_kanban sale.order.kanban sale.order kanban New
view_sale_order_pivot sale.order.pivot sale.order pivot New
view_sales_config sale settings sale.config.settings div Inherits sales_team.view_sale_config_settings
view_sales_order_filter sale.order.list.select sale.order search New
view_sales_order_line_filter sale.order.line.select sale.order.line search New
Models touched (20)

New fields (1)
  • so_line Many2one → sale.order.line
    string='Sale Order Line' args: 'sale.order.line'
Public methods (3)
  • create(self, values)
    @api.model
  • unlink(self)
    @api.multi
  • write(self, values)
    @api.multi

New fields (1)
  • group_analytic_account_for_sales Boolean
    help='Allows you to specify an analytic account on sales orders.' implied_group='sale.group_analytic_accounting' args: 'Analytic accounting for sales'
Public methods (0)

No public methods.

New fields (3)
  • comment Text
    default=_default_comment
  • partner_shipping_id Many2one → res.partner
    help='Delivery address for current invoice.' readonly=True states={'draft': [('readonly', False)]} string='Delivery Address' args: 'res.partner'
  • team_id Many2one → crm.team
    default=_get_default_team oldname='section_id' string='Sales Team' args: 'crm.team'
Public methods (3)
  • action_invoice_paid(self)
    @api.multi
  • get_delivery_partner_id(self)
    @api.multi
  • order_lines_layouted(self)
    @api.multi
    Returns this sale order lines ordered by sale_layout_category sequence. Used to render the report.

New fields (3)
  • layout_category_id Many2one → sale.layout_category
    string='Section' args: 'sale.layout_category'
  • layout_category_sequence Integer
    string='Layout Sequence'
  • sale_line_ids Many2many → sale.order.line
    copy=False readonly=True string='Sale Order Lines' args: 'sale.order.line', 'sale_order_line_invoice_rel', 'invoice_line_id', 'order_line_id'
Public methods (0)

No public methods.

New fields (1)
  • team_id Many2one → crm.team
    string='Sales Team' args: 'crm.team'
Public methods (0)

No public methods.

New fields (6)
  • currency_id Many2one → res.currency
    readonly=True related='company_id.currency_id' required=True string='Currency' args: 'res.currency'
  • invoiced Integer
    compute='_compute_invoiced' help='Invoice revenue for the current month. This is the amount the sales team has invoiced this month. It is used to compute the progression ratio of the current and target revenue on the kanban view.' readonly=True string='Invoiced This Month'
  • invoiced_target Integer
    help='Target of invoice revenue for the current month. This is the amount the sales team estimates to be able to invoice this month.' string='Invoice Target'
  • sales_to_invoice_amount Integer
    compute='_compute_sales_to_invoice_amount' readonly=True string='Amount of sales to invoice'
  • use_invoices Boolean
    help='Check this box to manage invoices in this sales team.' args: 'Invoices'
  • use_quotations Boolean
    default=True help='Check this box to manage quotations in this sales team.' args: 'Quotations'
Public methods (1)
  • update_invoiced_target(self, value)
    @api.multi

New fields (0)

No new fields.

Public methods (1)
  • send_mail(self, auto_commit=False)
    @api.multi

New fields (1)
  • sale_line_id Many2one → sale.order.line
    string='Sale Order Line' args: 'sale.order.line'
Public methods (0)

No public methods.

New fields (1)
  • discount_policy Selection
    default='with_discount' args: [('with_discount', 'Discount included in the price'), ('without_discount', 'Show public price & discount to the customer')]
Public methods (0)

No public methods.

New fields (1)
  • sales_count Integer
    compute='_sales_count' string='# Sales'
Public methods (0)

No public methods.

New fields (6)
  • expense_policy Selection
    default='no' string='Re-Invoice Expenses' args: [('no', 'No'), ('cost', 'At cost'), ('sales_price', 'At sale price')]
  • invoice_policy Selection
    default='order' help='Ordered Quantity: Invoice based on the quantity the customer ordered.\nDelivered Quantity: Invoiced based on the quantity the vendor delivered (time or deliveries).' string='Invoicing Policy' args: [('order', 'Ordered quantities'), ('delivery', 'Delivered quantities')]
  • sale_line_warn Selection
    default='no-message' help=WARNING_HELP required=True args: WARNING_MESSAGE, 'Sales Order Line'
  • sale_line_warn_msg Text
    args: 'Message for Sales Order Line'
  • sales_count Integer
    compute='_sales_count' string='# Sales'
  • track_service Selection
    default='manual' help='Manually set quantities on order: Invoice based on the manually entered quantity, without creating an analytic account.\nTimesheets on contract: Invoice based on the tracked hours on the related timesheet.\nCreate a task and track hours: Create a task on the sale order validation and track the work hours.' string='Track Service' args: [('manual', 'Manually set quantities on order')]
Public methods (1)
  • action_view_sales(self)
    @api.multi

New fields (1)
  • sale_note Text
    string='Default Terms and Conditions' translate=True
Public methods (0)

No public methods.

New fields (4)
  • sale_order_count Integer
    compute='_compute_sale_order_count' string='# of Sales Order'
  • sale_order_ids One2many → sale.order
    args: 'sale.order', 'partner_id', 'Sales Order'
  • sale_warn Selection
    default='no-message' help=WARNING_HELP required=True args: WARNING_MESSAGE, 'Sales Order'
  • sale_warn_msg Text
    args: 'Message for Sales Order'
Public methods (0)

No public methods.

New fields (6)
  • advance_payment_method Selection
    default=_get_advance_payment_method required=True string='What do you want to invoice?' args: [('delivered', 'Invoiceable lines'), ('all', 'Invoiceable lines (deduct down payments)'), ('percentage', 'Down payment (percentage)'), ('fixed', 'Down payment (fixed amount)')]
  • amount Float
    digits=dp.get_precision('Account') help='The amount to be invoiced in advance, taxes excluded.' args: 'Down Payment Amount'
  • count Integer
    default=_count string='# of Orders'
  • deposit_account_id Many2one → account.account
    default=_default_deposit_account_id domain=[('deprecated', '=', False)] help='Account used for deposits' string='Income Account' args: 'account.account'
  • deposit_taxes_id Many2many → account.tax
    default=_default_deposit_taxes_id help='Taxes used for deposits' string='Customer Taxes' args: 'account.tax'
  • product_id Many2one → product.product
    default=_default_product_id domain=[('type', '=', 'service')] string='Down Payment Product' args: 'product.product'
Public methods (2)
  • create_invoices(self)
    @api.multi
  • onchange_advance_payment_method(self)
    @api.onchange('advance_payment_method')

New fields (23)
  • auto_done_setting Selection
    args: [(0, "Allow to edit sales order from the 'Sales Order' menu (not from the Quotation menu)"), (1, 'Never allow to modify a confirmed sales order')], 'Sale Order Modification'
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • default_invoice_policy Selection
    default='order' default_model='product.template' args: [('order', 'Invoice ordered quantities'), ('delivery', 'Invoice delivered quantities')], 'Default Invoicing'
  • deposit_product_id_setting Many2one → product.product
    domain="[('type', '=', 'service')]" help='Default product used for payment advances' args: 'product.product', 'Deposit Product'
  • group_discount_per_so_line Selection
    implied_group='sale.group_discount_per_so_line' args: [(0, 'No discount on sales order lines, global discount only'), (1, 'Allow discounts on sales order lines')], 'Discount'
  • group_display_incoterm Selection
    help='The printed reports will display the incoterms for the sales orders and the related invoices' implied_group='sale.group_display_incoterm' args: [(0, 'No incoterm on reports'), (1, 'Show incoterms on sales orders and invoices')], 'Incoterms'
  • group_pricelist_item Boolean
    implied_group='product.group_pricelist_item' args: 'Show pricelists to customers'
  • group_product_pricelist Boolean
    implied_group='product.group_product_pricelist' args: 'Show pricelists On Products'
  • group_product_variant Selection
    help='Work with product variant allows you to define some variant of the same products\n , an ease the product management in the ecommerce for example' implied_group='product.group_product_variant' args: [(0, 'No variants on products'), (1, 'Products can have several attributes, defining variants (Example: size, color,...)')], 'Product Variants'
  • group_sale_delivery_address Selection
    implied_group='sale.group_delivery_invoice_address' args: [(0, 'Invoicing and shipping addresses are always the same (Example: services companies)'), (1, 'Display 3 fields on sales orders: customer, invoice address, delivery address')], 'Addresses'
  • group_sale_layout Selection
    implied_group='sale.group_sale_layout' args: [(0, 'Do not personalize sales orders and invoice reports'), (1, 'Personalize the sales orders and invoice report with categories, subtotals and page-breaks')], 'Sales Reports Layout'
  • group_sale_pricelist Boolean
    help='Allows to manage different prices based on rules per category of customers.\n Example: 10% for retailers, promotion of 5 EUR on this product, etc.' implied_group='product.group_sale_pricelist' args: 'Use pricelists to adapt your price per customers'
  • group_show_price_subtotal Boolean
    group='base.group_portal,base.group_user,base.group_public' implied_group='sale.group_show_price_subtotal' args: 'Show subtotal'
  • group_show_price_total Boolean
    group='base.group_portal,base.group_user,base.group_public' implied_group='sale.group_show_price_total' args: 'Show total'
  • group_uom Selection
    help='Allows you to select and maintain different units of measure for products.' implied_group='product.group_uom' args: [(0, 'Products have only one unit of measure (easier)'), (1, 'Some products may be sold/purchased in different units of measure (advanced)')], 'Units of Measure'
  • group_warning_sale Selection
    implied_group='sale.group_warning_sale' args: [(0, 'All the products and the customers can be used in sales orders'), (1, 'An informative or blocking warning can be set on a product or a customer')], 'Warning'
  • module_sale_contract Boolean
    args: 'Manage subscriptions and recurring invoicing'
  • module_sale_margin Selection
    args: [(0, 'Salespeople do not need to view margins when quoting'), (1, 'Display margins on quotations and sales orders')], 'Margins'
  • module_website_quote Selection
    args: [(0, 'Print quotes or send by email'), (1, 'Send quotations your customer can approve & pay online (advanced)')], 'Online Quotations'
  • module_website_sale_digital Boolean
    args: 'Sell digital products - provide downloadable content on your customer portal'
  • sale_note Text
    related='company_id.sale_note' string='Default Terms and Conditions *'
  • sale_pricelist_setting Selection
    default='fixed' help='Fix Price: all price manage from products sale price.\nDifferent prices per Customer: you can assign price on buying of minimum quantity in products sale tab.\nAdvanced pricing based on formula: You can have all the rights on pricelist' required=True args: [('fixed', 'A single sale price per product'), ('percentage', 'Specific prices per customer segment, currency, etc.'), ('formula', 'Advanced pricing based on formulas (discounts, margins, rounding)')]
  • sale_show_tax Selection
    default='subtotal' required=True args: [('subtotal', 'Show line subtotals without taxes (B2B)'), ('total', 'Show line subtotals with taxes included (B2C)')], 'Tax Display'
Public methods (4)
  • set_auto_done_defaults(self)
    @api.multi
  • set_deposit_product_id_defaults(self)
    @api.multi
  • set_sale_defaults(self)
    @api.multi
  • set_sale_tax_defaults(self)
    @api.multi

New fields (4)
  • name Char
    required=True translate=True args: 'Name'
  • pagebreak Boolean
    args: 'Add pagebreak'
  • sequence Integer
    default=10 required=True args: 'Sequence'
  • subtotal Boolean
    default=True args: 'Add subtotal'
Public methods (0)

No public methods.

New fields (30)
  • amount_tax Monetary
    compute='_amount_all' readonly=True store=True string='Taxes' track_visibility='always'
  • amount_total Monetary
    compute='_amount_all' readonly=True store=True string='Total' track_visibility='always'
  • amount_untaxed Monetary
    compute='_amount_all' readonly=True store=True string='Untaxed Amount' track_visibility='always'
  • client_order_ref Char
    copy=False string='Customer Reference'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • confirmation_date Datetime
    copy=False help='Date on which the sale order is confirmed.' index=True oldname='date_confirm' readonly=True string='Confirmation Date'
  • create_date Datetime
    help='Date on which sales order is created.' index=True readonly=True string='Creation Date'
  • currency_id Many2one → res.currency
    readonly=True related='pricelist_id.currency_id' required=True string='Currency' args: 'res.currency'
  • date_order Datetime
    copy=False default=fields.Datetime.now index=True readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Order Date'
  • fiscal_position_id Many2one → account.fiscal.position
    oldname='fiscal_position' string='Fiscal Position' args: 'account.fiscal.position'
  • invoice_count Integer
    compute='_get_invoiced' readonly=True string='# of Invoices'
  • invoice_ids Many2many → account.invoice
    compute='_get_invoiced' copy=False readonly=True string='Invoices' args: 'account.invoice'
  • invoice_status Selection
    compute='_get_invoiced' readonly=True store=True string='Invoice Status' args: [('upselling', 'Upselling Opportunity'), ('invoiced', 'Fully Invoiced'), ('to invoice', 'To Invoice'), ('no', 'Nothing to Invoice')]
  • name Char
    copy=False default=<expr> index=True readonly=True required=True states={'draft': [('readonly', False)]} string='Order Reference'
  • note Text
    default=_default_note args: 'Terms and conditions'
  • order_line One2many → sale.order.line
    copy=True states={'cancel': [('readonly', True)], 'done': [('readonly', True)]} string='Order Lines' args: 'sale.order.line', 'order_id'
  • origin Char
    help='Reference of the document that generated this sales order request.' string='Source Document'
  • partner_id Many2one → res.partner
    change_default=True index=True readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Customer' track_visibility='always' args: 'res.partner'
  • partner_invoice_id Many2one → res.partner
    help='Invoice address for current sales order.' readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Invoice Address' args: 'res.partner'
  • partner_shipping_id Many2one → res.partner
    help='Delivery address for current sales order.' readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Delivery Address' args: 'res.partner'
  • payment_term_id Many2one → account.payment.term
    oldname='payment_term' string='Payment Terms' args: 'account.payment.term'
  • pricelist_id Many2one → product.pricelist
    help='Pricelist for current sales order.' readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Pricelist' args: 'product.pricelist'
  • procurement_group_id Many2one → procurement.group
    copy=False args: 'procurement.group', 'Procurement Group'
  • product_id Many2one → product.product
    related='order_line.product_id' string='Product' args: 'product.product'
  • project_id Many2one → account.analytic.account
    copy=False help='The analytic account related to a sales order.' readonly=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} args: 'account.analytic.account', 'Analytic Account'
  • related_project_id Many2one → account.analytic.account
    help='The analytic account related to a sales order.' inverse='_inverse_project_id' related='project_id' string='Analytic Account' args: 'account.analytic.account'
  • state Selection
    copy=False default='draft' index=True readonly=True string='Status' track_visibility='onchange' args: [('draft', 'Quotation'), ('sent', 'Quotation Sent'), ('sale', 'Sales Order'), ('done', 'Locked'), ('cancel', 'Cancelled')]
  • team_id Many2one → crm.team
    change_default=True default=_get_default_team oldname='section_id' args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    default=<expr> index=True string='Salesperson' track_visibility='onchange' args: 'res.users'
  • validity_date Date
    copy=False help='Manually set the expiration date of your quotation (offer), or it will set the date automatically based on the template if online quotation is installed.' readonly=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Expiration Date'
Public methods (16)
  • action_cancel(self)
    @api.multi
  • action_confirm(self)
    @api.multi
  • action_done(self)
    @api.multi
  • action_draft(self)
    @api.multi
  • action_invoice_create(self, grouped=False, final=False)
    @api.multi
    Create the invoice associated to the SO. :param grouped: if True, invoices are grouped by SO id. If False, invoices are grouped by (partner_invoice_id, currency) :param final: if True, refunds will be generated if necessary :returns: list of created invoices
  • action_quotation_send(self)
    @api.multi
    This function opens a window to compose an email, with the edi sale template message loaded by default
  • action_view_invoice(self)
    @api.multi
  • button_dummy(self)
    @api.multi
  • create(self, vals)
    @api.model
  • force_quotation_send(self)
    @api.multi
  • onchange_partner_id(self)
    @api.multi@api.onchange('partner_id')
    Update the following fields when the partner is changed: - Pricelist - Payment term - Invoice address - Delivery address
  • onchange_partner_id_warning(self)
    @api.onchange('partner_id')
  • onchange_partner_shipping_id(self)
    @api.multi@api.onchange('partner_shipping_id', 'partner_id')
    Trigger the change of fiscal position when the shipping address is modified.
  • order_lines_layouted(self)
    @api.multi
    Returns this order lines classified by sale_layout_category and separated in pages according to the category pagebreaks. Used to render the report.
  • print_quotation(self)
    @api.multi
  • unlink(self)
    @api.multi

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (31)
  • analytic_tag_ids Many2many → account.analytic.tag
    string='Analytic Tags' args: 'account.analytic.tag'
  • company_id Many2one
    readonly=True related='order_id.company_id' store=True string='Company'
  • currency_id Many2one
    readonly=True related='order_id.currency_id' store=True string='Currency'
  • customer_lead Float
    default=0.0 help='Number of days between the order confirmation and the shipping of the products to the customer' oldname='delay' required=True args: 'Delivery Lead Time'
  • discount Float
    default=0.0 digits=dp.get_precision('Discount') string='Discount (%)'
  • invoice_lines Many2many → account.invoice.line
    copy=False string='Invoice Lines' args: 'account.invoice.line', 'sale_order_line_invoice_rel', 'order_line_id', 'invoice_line_id'
  • invoice_status Selection
    compute='_compute_invoice_status' default='no' readonly=True store=True string='Invoice Status' args: [('upselling', 'Upselling Opportunity'), ('invoiced', 'Fully Invoiced'), ('to invoice', 'To Invoice'), ('no', 'Nothing to Invoice')]
  • layout_category_id Many2one → sale.layout_category
    string='Section' args: 'sale.layout_category'
  • layout_category_sequence Integer
    string='Layout Sequence'
  • name Text
    required=True string='Description'
  • order_id Many2one → sale.order
    copy=False index=True ondelete='cascade' required=True string='Order Reference' args: 'sale.order'
  • order_partner_id Many2one
    related='order_id.partner_id' store=True string='Customer'
  • price_reduce Monetary
    compute='_get_price_reduce' readonly=True store=True string='Price Reduce'
  • price_reduce_taxexcl Monetary
    compute='_get_price_reduce_notax' readonly=True store=True string='Price Reduce Tax excl'
  • price_reduce_taxinc Monetary
    compute='_get_price_reduce_tax' readonly=True store=True string='Price Reduce Tax inc'
  • price_subtotal Monetary
    compute='_compute_amount' readonly=True store=True string='Subtotal'
  • price_tax Monetary
    compute='_compute_amount' readonly=True store=True string='Taxes'
  • price_total Monetary
    compute='_compute_amount' readonly=True store=True string='Total'
  • price_unit Float
    default=0.0 digits=dp.get_precision('Product Price') required=True args: 'Unit Price'
  • procurement_ids One2many → procurement.order
    string='Procurements' args: 'procurement.order', 'sale_line_id'
  • product_id Many2one → product.product
    change_default=True domain=[('sale_ok', '=', True)] ondelete='restrict' required=True string='Product' args: 'product.product'
  • product_uom Many2one → product.uom
    required=True string='Unit of Measure' args: 'product.uom'
  • product_uom_qty Float
    default=1.0 digits=dp.get_precision('Product Unit of Measure') required=True string='Quantity'
  • qty_delivered Float
    copy=False default=0.0 digits=dp.get_precision('Product Unit of Measure') string='Delivered'
  • qty_delivered_updateable Boolean
    compute='_compute_qty_delivered_updateable' default=True readonly=True string='Can Edit Delivered'
  • qty_invoiced Float
    compute='_get_invoice_qty' digits=dp.get_precision('Product Unit of Measure') readonly=True store=True string='Invoiced'
  • qty_to_invoice Float
    compute='_get_to_invoice_qty' digits=dp.get_precision('Product Unit of Measure') readonly=True store=True string='To Invoice'
  • salesman_id Many2one
    readonly=True related='order_id.user_id' store=True string='Salesperson'
  • sequence Integer
    default=10 string='Sequence'
  • state Selection
    copy=False default='draft' readonly=True related='order_id.state' store=True string='Order Status' args: [('draft', 'Quotation'), ('sent', 'Quotation Sent'), ('sale', 'Sale Order'), ('done', 'Done'), ('cancel', 'Cancelled')]
  • tax_id Many2many → account.tax
    domain=['|', ('active', '=', False), ('active', '=', True)] string='Taxes' args: 'account.tax'
Public methods (6)
  • create(self, values)
    @api.model
  • invoice_line_create(self, invoice_id, qty)
    @api.multi
    Create an invoice line. The quantity to invoice can be positive (invoice) or negative (refund). :param invoice_id: integer :param qty: float quantity to invoice
  • product_id_change(self)
    @api.multi@api.onchange('product_id')
  • product_uom_change(self)
    @api.onchange('product_uom', 'product_uom_qty')
  • unlink(self)
    @api.multi
  • write(self, values)
    @api.multi

New fields (24)
  • analytic_account_id Many2one → account.analytic.account
    readonly=True args: 'account.analytic.account', 'Analytic Account'
  • categ_id Many2one → product.category
    readonly=True args: 'product.category', 'Product Category'
  • commercial_partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Commercial Entity'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Partner Country'
  • date Datetime
    readonly=True args: 'Date Order'
  • name Char
    readonly=True args: 'Order Reference'
  • nbr Integer
    readonly=True args: '# of Lines'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Partner'
  • price_subtotal Float
    readonly=True args: 'Untaxed Total'
  • price_total Float
    readonly=True args: 'Total'
  • pricelist_id Many2one → product.pricelist
    readonly=True args: 'product.pricelist', 'Pricelist'
  • product_id Many2one → product.product
    readonly=True args: 'product.product', 'Product'
  • product_tmpl_id Many2one → product.template
    readonly=True args: 'product.template', 'Product Template'
  • product_uom Many2one → product.uom
    readonly=True args: 'product.uom', 'Unit of Measure'
  • product_uom_qty Float
    readonly=True args: '# of Qty'
  • qty_delivered Float
    readonly=True args: 'Qty Delivered'
  • qty_invoiced Float
    readonly=True args: 'Qty Invoiced'
  • qty_to_invoice Float
    readonly=True args: 'Qty To Invoice'
  • state Selection
    readonly=True string='Status' args: [('draft', 'Draft Quotation'), ('sent', 'Quotation Sent'), ('sale', 'Sales Order'), ('done', 'Sales Done'), ('cancel', 'Cancelled')]
  • team_id Many2one → crm.team
    oldname='section_id' readonly=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    readonly=True args: 'res.users', 'Salesperson'
  • volume Float
    readonly=True args: 'Volume'
  • weight Float
    readonly=True args: 'Gross Weight'
Public methods (1)
  • init(self)
    @api.model_cr
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/9.0/sale
VERSION
VERSION 1.0
CATEGORY
CATEGORYSales
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Christophe Matthieu, Martin Trigaux, Fabien Pinckaers, Antony Lesuisse, Olivier Dony, Thibault Delavallée, Josse Colpaert, Denis Ledoux, Christophe Simonis, David Monjoie, Xavier Morel, Goffin Simon, Cedric Snauwaert, Nicolas Martinelli, Nicolas Lempereur, Jérome Maes, Richard Mathot, qdp-odoo, Géry Debongnie, Aaron Bohy, Jeremy Kersten, GitHub, Damien Bouvy, Julien De Coster, pvy, Rucha Dave, Yannick Tivisse, qsm-odoo, Cédric Snauwaert, Martin Geubelle, Quentin De Paoli
WEBSITE
WEBSITEhttps://www.odoo.com/page/crm
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:48:30
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sales_team
    - base
    - mail
    - base_setup
    - web_kanban
    - web
    - bus
    - account
    - product
    - decimal_precision
    - report
    - analytic
    - web_tip
    - web_planner
    - procurement
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage sales quotations and orders
==================================

This application allows you to manage your sales goals in an effective and efficient manner by keeping track of all sales orders and history.

It handles the full sales workflow:

* **Quotation** -> **Sales order** -> **Invoice**

Preferences (only with Warehouse Management installed)
------------------------------------------------------

If you also installed the Warehouse Management, you can deal with the following preferences:

* Shipping: Choice of delivery at once or partial delivery
* Invoicing: choose how invoices will be paid
* Incoterms: International Commercial terms

You can choose flexible invoicing methods:

* *On Demand*: Invoices are created manually from Sales Orders when needed
* *On Delivery Order*: Invoices are generated from picking (delivery)
* *Before Delivery*: A Draft invoice is created and must be paid before delivery


The Dashboard for the Sales Manager will include
------------------------------------------------
* My Quotations
* Monthly Turnover (Graph)
    

Code Analysis

Views touched (31)
XML IDNameModelTypeStatus
account_invoice_form Account Invoice account.invoice data Inherits account.invoice_form
account_invoice_groupby_inherit account.invoice.groupby account.invoice xpath Inherits account.view_account_invoice_filter
assets_backend project assets ir.ui.view qweb Inherits web.assets_backend
crm_lead_partner_kanban_view res.partner.kanban.saleorder.inherit res.partner field Inherits base.res_partner_kanban_view
crm_team_salesteams_view_form crm.team.form crm.team xpath Inherits sales_team.crm_team_view_form
crm_team_salesteams_view_kanban crm.team.kanban crm.team data Inherits sales_team.crm_team_salesteams_view_kanban
product_form_view_sale_order_button product.product.sale.order product.product div Inherits product.product_normal_form_view
product_template_form_view_invoice_policy product.template.invoice.policy product.template field Inherits product.product_template_form_view
product_template_form_view_sale_order_button product.template.sale.order.button product.template div Inherits product.product_template_only_form_view
report_saleorder report_saleorder ir.ui.view qweb New
report_saleorder_document report_saleorder_document ir.ui.view qweb New
res_partner_view_buttons res.partner.view.buttons res.partner div Inherits base.view_partner_form
view_account_config account settings account.config.settings separator Inherits account.view_account_config_settings
view_account_invoice_report_search_inherit account.invoice.report.search.inherit account.invoice.report xpath Inherits account.view_account_invoice_report_search
view_company_inherit_form2 res.company.form.inherit res.company xpath Inherits base.view_company_form
view_order_form sale.order.form sale.order form New
view_order_form_editable_list sale.order.form.editable.list sale.order xpath Inherits sale.view_order_form
view_order_line_tree sale.order.line.tree sale.order.line tree New
view_order_product_graph sale.report.graph sale.report graph New
view_order_product_pivot sale.report.pivot sale.report pivot New
view_order_product_search sale.report.search sale.report search New
view_order_tree sale.order.tree sale.order tree New
view_quotation_tree sale.order.tree sale.order tree New
view_sale_advance_payment_inv Invoice Orders sale.advance.payment.inv form New
view_sale_order_calendar sale.order.calendar sale.order calendar New
view_sale_order_graph sale.order.graph sale.order graph New
view_sale_order_kanban sale.order.kanban sale.order kanban New
view_sale_order_pivot sale.order.pivot sale.order pivot New
view_sales_config sale settings sale.config.settings div Inherits base_setup.view_sale_config_settings
view_sales_order_filter sale.order.list.select sale.order search New
view_sales_order_line_filter sale.order.line.select sale.order.line search New
Models touched (15)

New fields (1)
  • so_line Many2one → sale.order.line
    string='Sale Order Line' args: 'sale.order.line'
Public methods (3)
  • create(self, values)
    @api.model
  • unlink(self)
    @api.multi
  • write(self, values)
    @api.multi

New fields (1)
  • team_id Many2one → crm.team
    default=_get_default_team oldname='section_id' string='Sales Team' args: 'crm.team'
Public methods (1)
  • confirm_paid(self)
    @api.multi

New fields (1)
  • sale_line_ids Many2many → sale.order.line
    copy=False readonly=True string='Sale Order Lines' args: 'sale.order.line', 'sale_order_line_invoice_rel', 'invoice_line_id', 'order_line_id'
Public methods (0)

No public methods.

New fields (1)
  • team_id Many2one → crm.team
    string='Sales Team' args: 'crm.team'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • update_invoiced_target(self, cr, uid, id, value, context=None)

New fields (0)

No new fields.

Public methods (1)
  • send_mail(self, auto_commit=False)
    @api.multi

New fields (1)
  • sale_line_id Many2one → sale.order.line
    string='Sale Order Line' args: 'sale.order.line'
Public methods (0)

No public methods.

New fields (1)
  • sales_count Integer
    compute='_sales_count' string='# Sales'
Public methods (0)

No public methods.

New fields (3)
  • invoice_policy Selection
    default='order' string='Invoicing Policy' args: [('order', 'Ordered quantities'), ('delivery', 'Delivered quantities'), ('cost', 'Invoice based on time and material')]
  • sales_count Integer
    compute='_sales_count' string='# Sales'
  • track_service Selection
    default='manual' string='Track Service' args: [('manual', 'Manually set quantities on order')]
Public methods (1)
  • action_view_sales(self)
    @api.multi

New fields (1)
  • sale_note Text
    string='Default Terms and Conditions' translate=True
Public methods (0)

No public methods.

New fields (6)
  • advance_payment_method Selection
    default=_get_advance_payment_method required=True string='What do you want to invoice?' args: [('delivered', 'Invoiceable lines'), ('all', 'Invoiceable lines (deduct down payments)'), ('percentage', 'Down payment (percentage)'), ('fixed', 'Down payment (fixed amount)')]
  • amount Float
    digits=dp.get_precision('Account') help='The amount to be invoiced in advance, taxes excluded.' args: 'Down Payment Amount'
  • count Integer
    default=_count string='# of Orders'
  • deposit_account_id Many2one → account.account
    default=_default_deposit_account_id domain=[('deprecated', '=', False)] help='Account used for deposits' string='Income Account' args: 'account.account'
  • deposit_taxes_id Many2many → account.tax
    default=_default_deposit_taxes_id help='Taxes used for deposits' string='Customer Taxes' args: 'account.tax'
  • product_id Many2one → product.product
    default=_default_product_id domain=[('type', '=', 'service')] string='Down Payment Product' args: 'product.product'
Public methods (2)
  • create_invoices(self)
    @api.multi
  • onchange_advance_payment_method(self)
    @api.onchange('advance_payment_method')

New fields (0)

No new fields.

Public methods (4)
  • onchange_sale_price(self, cr, uid, ids, sale_pricelist_setting, context=None)
  • set_auto_done_defaults(self, cr, uid, ids, context=None)
  • set_deposit_product_id_defaults(self, cr, uid, ids, context=None)
  • set_sale_defaults(self, cr, uid, ids, context=None)

New fields (28)
  • amount_tax Monetary
    compute='_amount_all' readonly=True store=True string='Taxes' track_visibility='always'
  • amount_total Monetary
    compute='_amount_all' readonly=True store=True string='Total' track_visibility='always'
  • amount_untaxed Monetary
    compute='_amount_all' readonly=True store=True string='Untaxed Amount' track_visibility='always'
  • client_order_ref Char
    copy=False string='Customer Reference'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • create_date Datetime
    help='Date on which sales order is created.' index=True readonly=True string='Creation Date'
  • currency_id Many2one → res.currency
    readonly=True related='pricelist_id.currency_id' required=True string='Currency' args: 'res.currency'
  • date_order Datetime
    copy=False default=fields.Datetime.now index=True readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Order Date'
  • fiscal_position_id Many2one → account.fiscal.position
    oldname='fiscal_position' string='Fiscal Position' args: 'account.fiscal.position'
  • invoice_count Integer
    compute='_get_invoiced' readonly=True string='# of Invoices'
  • invoice_ids Many2many → account.invoice
    compute='_get_invoiced' copy=False readonly=True string='Invoices' args: 'account.invoice'
  • invoice_status Selection
    compute='_get_invoiced' default='no' readonly=True store=True string='Invoice Status' args: [('upselling', 'Upselling Opportunity'), ('invoiced', 'Fully Invoiced'), ('to invoice', 'To Invoice'), ('no', 'Nothing to Invoice')]
  • name Char
    copy=False default=<expr> index=True readonly=True required=True states={'draft': [('readonly', False)]} string='Order Reference'
  • note Text
    default=_default_note args: 'Terms and conditions'
  • order_line One2many → sale.order.line
    copy=True states={'cancel': [('readonly', True)], 'done': [('readonly', True)]} string='Order Lines' args: 'sale.order.line', 'order_id'
  • origin Char
    help='Reference of the document that generated this sales order request.' string='Source Document'
  • partner_id Many2one → res.partner
    change_default=True index=True readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Customer' track_visibility='always' args: 'res.partner'
  • partner_invoice_id Many2one → res.partner
    help='Invoice address for current sales order.' readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Invoice Address' args: 'res.partner'
  • partner_shipping_id Many2one → res.partner
    help='Delivery address for current sales order.' readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Delivery Address' args: 'res.partner'
  • payment_term_id Many2one → account.payment.term
    oldname='payment_term' string='Payment Term' args: 'account.payment.term'
  • pricelist_id Many2one → product.pricelist
    help='Pricelist for current sales order.' readonly=True required=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Pricelist' args: 'product.pricelist'
  • procurement_group_id Many2one → procurement.group
    copy=False args: 'procurement.group', 'Procurement Group'
  • product_id Many2one → product.product
    related='order_line.product_id' string='Product' args: 'product.product'
  • project_id Many2one → account.analytic.account
    copy=False domain=[('account_type', '=', 'normal')] help='The analytic account related to a sales order.' readonly=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} args: 'account.analytic.account', 'Analytic Account'
  • state Selection
    copy=False default='draft' index=True readonly=True string='Status' track_visibility='onchange' args: [('draft', 'Quotation'), ('sent', 'Quotation Sent'), ('sale', 'Sale Order'), ('done', 'Done'), ('cancel', 'Cancelled')]
  • team_id Many2one → crm.team
    change_default=True default=_get_default_team oldname='section_id' args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    default=<expr> index=True string='Salesperson' track_visibility='onchange' args: 'res.users'
  • validity_date Date
    readonly=True states={'draft': [('readonly', False)], 'sent': [('readonly', False)]} string='Expiration Date'
Public methods (14)
  • action_cancel(self)
    @api.multi
  • action_confirm(self)
    @api.multi
  • action_done(self)
    @api.multi
  • action_draft(self)
    @api.multi
  • action_invoice_create(self, grouped=False, final=False)
    @api.multi
    Create the invoice associated to the SO. :param grouped: if True, invoices are grouped by SO id. If False, invoices are grouped by (partner_invoice_id, currency) :param final: if True, refunds will be generated if necessary :returns: list of created invoices
  • action_quotation_send(self)
    @api.multi
    This function opens a window to compose an email, with the edi sale template message loaded by default
  • action_view_invoice(self)
    @api.multi
  • button_dummy(self)
    @api.multi
  • create(self, vals)
    @api.model
  • force_quotation_send(self)
    @api.multi
  • onchange_partner_id(self)
    @api.multi@api.onchange('partner_id')
    Update the following fields when the partner is changed: - Pricelist - Payment term - Invoice address - Delivery address
  • onchange_partner_shipping_id(self)
    @api.multi@api.onchange('partner_shipping_id', 'partner_id')
    Trigger the change of fiscal position when the shipping address is modified.
  • print_quotation(self)
    @api.multi
  • unlink(self)
    @api.multi

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (26)
  • company_id Many2one
    readonly=True related='order_id.company_id' store=True string='Company'
  • currency_id Many2one
    readonly=True related='order_id.currency_id' store=True string='Currency'
  • customer_lead Float
    default=0.0 help='Number of days between the order confirmation and the shipping of the products to the customer' oldname='delay' required=True args: 'Delivery Lead Time'
  • discount Float
    default=0.0 digits=dp.get_precision('Discount') string='Discount (%)'
  • invoice_lines Many2many → account.invoice.line
    copy=False string='Invoice Lines' args: 'account.invoice.line', 'sale_order_line_invoice_rel', 'order_line_id', 'invoice_line_id'
  • invoice_status Selection
    compute='_compute_invoice_status' default='no' readonly=True store=True string='Invoice Status' args: [('upselling', 'Upselling Opportunity'), ('invoiced', 'Fully Invoiced'), ('to invoice', 'To Invoice'), ('no', 'Nothing to Invoice')]
  • name Text
    required=True string='Description'
  • order_id Many2one → sale.order
    copy=False index=True ondelete='cascade' required=True string='Order Reference' args: 'sale.order'
  • order_partner_id Many2one
    related='order_id.partner_id' store=True string='Customer'
  • price_reduce Monetary
    compute='_get_price_reduce' readonly=True store=True string='Price Reduce'
  • price_subtotal Monetary
    compute='_compute_amount' readonly=True store=True string='Subtotal'
  • price_tax Monetary
    compute='_compute_amount' readonly=True store=True string='Taxes'
  • price_total Monetary
    compute='_compute_amount' readonly=True store=True string='Total'
  • price_unit Float
    default=0.0 digits=dp.get_precision('Product Price') required=True args: 'Unit Price'
  • procurement_ids One2many → procurement.order
    string='Procurements' args: 'procurement.order', 'sale_line_id'
  • product_id Many2one → product.product
    change_default=True domain=[('sale_ok', '=', True)] ondelete='restrict' required=True string='Product' args: 'product.product'
  • product_uom Many2one → product.uom
    required=True string='Unit of Measure' args: 'product.uom'
  • product_uom_qty Float
    default=1.0 digits=dp.get_precision('Product Unit of Measure') required=True string='Quantity'
  • qty_delivered Float
    copy=False default=0.0 digits=dp.get_precision('Product Unit of Measure') string='Delivered'
  • qty_delivered_updateable Boolean
    compute='_compute_qty_delivered_updateable' default=True readonly=True string='Can Edit Delivered'
  • qty_invoiced Float
    compute='_get_invoice_qty' default=0.0 digits=dp.get_precision('Product Unit of Measure') readonly=True store=True string='Invoiced'
  • qty_to_invoice Float
    compute='_get_to_invoice_qty' default=0.0 digits=dp.get_precision('Product Unit of Measure') readonly=True store=True string='To Invoice'
  • salesman_id Many2one
    readonly=True related='order_id.user_id' store=True string='Salesperson'
  • sequence Integer
    default=10 string='Sequence'
  • state Selection
    copy=False default='draft' readonly=True related='order_id.state' store=True string='Order Status' args: [('draft', 'Quotation'), ('sent', 'Quotation Sent'), ('sale', 'Sale Order'), ('done', 'Done'), ('cancel', 'Cancelled')]
  • tax_id Many2many → account.tax
    domain=['|', ('active', '=', False), ('active', '=', True)] string='Taxes' args: 'account.tax'
Public methods (6)
  • create(self, values)
    @api.model
  • invoice_line_create(self, invoice_id, qty)
    @api.multi
    Create an invoice line. The quantity to invoice can be positive (invoice) or negative (refund). :param invoice_id: integer :param qty: float quantity to invoice
  • product_id_change(self)
    @api.multi@api.onchange('product_id')
  • product_uom_change(self)
    @api.onchange('product_uom', 'product_uom_qty')
  • unlink(self)
    @api.multi
  • write(self, values)
    @api.multi
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/8.0/sale
VERSION
VERSION 1.0
CATEGORY
CATEGORYSales Management
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSRaphael Collet, Atul Patel (OpenERP), Randhir Mayatra (OpenERP), Stephane Wirtel, Odoo Translation Bot, Turkesh Patel (Open ERP), Christophe Matthieu, ajay javiya (OpenERP), Martin Trigaux, Ajay Chauhan (OpenERP), Foram Katharotiya (OpenERP), Fabien Pinckaers, Antony Lesuisse, Olivier Dony, Tejas Tank, Thibault Delavallée, Vo Minh Thu, Josse Colpaert, Launchpad Translations on behalf of openerp, Quentin (OpenERP), Denis Ledoux, Fabien Meghazi, niv-openerp, ggh-openerp, Christophe Simonis, Xavier Morel, Goffin Simon, Bhumi Thakkar (Open ERP), Cedric Snauwaert, Simon Lejeune, Gilles Major, Vishmita, Nicolas Martinelli, Chirag Dodiya (OpenERP Trainee), Ravish (Open ERP), Anaël Closson, Amit Bhavsar (Open ERP), Paramjit Singh Sahota, Nicolas Lempereur, Anand Patel (OpenERP), Julien Legros, Nimesh Contractor (OpenERP), Richard Mathot, qdp-odoo, Géry Debongnie, jke-openerp, Aaron Bohy, Vishmita Jadeja (openerp), Bharat R. Devnani (OpenERP), Richard Mathot (OpenERP), ged-odoo, chm@openerp.com, Mahendra Barad (OpenERP), openerp-sle, Jeremy Kersten, Gery Debongnie, Randhir Mayatra rma-openerp, sgo@tinyerp.com, Darshan Kalola (OpenERP), Darshan Kalola, Yogesh Parekh (OpenERP), Sunil Sharma (OpenERP), Pooja Zankhariya (OpenERP), Prashant Panchal (OpenERP), Ravi Gadhia, DJ Patel, Denis Michiels
WEBSITE
WEBSITEhttps://www.odoo.com/page/crm
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:45:39
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sales_team
    - base
    - mail
    - base_setup
    - web_kanban
    - web
    - web_kanban_sparkline
    - account_voucher
    - account
    - product
    - decimal_precision
    - report
    - analytic
    - board
    - edi
    - email_template
    - procurement
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage sales quotations and orders
==================================

This application allows you to manage your sales goals in an effective and efficient manner by keeping track of all sales orders and history.

It handles the full sales workflow:

* **Quotation** -> **Sales order** -> **Invoice**

Preferences (only with Warehouse Management installed)
------------------------------------------------------

If you also installed the Warehouse Management, you can deal with the following preferences:

* Shipping: Choice of delivery at once or partial delivery
* Invoicing: choose how invoices will be paid
* Incoterms: International Commercial terms

You can choose flexible invoicing methods:

* *On Demand*: Invoices are created manually from Sales Orders when needed
* *On Delivery Order*: Invoices are generated from picking (delivery)
* *Before Delivery*: A Draft invoice is created and must be paid before delivery


The Dashboard for the Sales Manager will include
------------------------------------------------
* My Quotations
* Monthly Turnover (Graph)
    

Code Analysis

Views touched (32)
XML IDNameModelTypeStatus
account_invoice_form Account Invoice account.invoice data Inherits account.invoice_form
account_invoice_groupby_inherit account.invoice.groupby account.invoice xpath Inherits account.view_account_invoice_filter
account_invoice_tree Account Invoice account.invoice data Inherits account.invoice_tree
crm_case_section_salesteams_view_form crm.case.section.form crm.case.section data Inherits sales_team.crm_case_section_view_form
crm_case_section_salesteams_view_kanban crm.case.section.kanban crm.case.section data Inherits sales_team.crm_case_section_salesteams_view_kanban
crm_lead_partner_kanban_view res.partner.kanban.saleorder.inherit res.partner field Inherits base.res_partner_kanban_view
product_form_view_sale_order_button product.product.sale.order product.product xpath Inherits product.product_normal_form_view
product_template_form_view_sale_order_button product.template.sale.order.button product.template xpath Inherits product.product_template_only_form_view
report_saleorder report_saleorder ir.ui.view qweb New
report_saleorder_document report_saleorder_document ir.ui.view qweb New
res_partner_address_type res.partner.view.address_type res.partner xpath Inherits base.view_partner_form
res_partner_view_buttons res.partner.view.buttons res.partner xpath Inherits base.view_partner_form
view_account_config account settings account.config.settings separator Inherits account.view_account_config_settings
view_account_invoice_report_search_inherit account.invoice.report.search account.invoice.report filter Inherits account.view_account_invoice_report_search
view_company_inherit_form2 res.company.form.inherit res.company xpath Inherits base.view_company_form
view_order_form sale.order.form sale.order form New
view_order_form_editable_list sale.order.form.editable.list sale.order xpath Inherits sale.view_order_form
view_order_line_form2 sale.order.line.form2 sale.order.line form New
view_order_line_tree sale.order.line.tree sale.order.line tree New
view_order_product_graph sale.report.graph sale.report graph New
view_order_product_search sale.report.search sale.report search New
view_order_tree sale.order.tree sale.order tree New
view_quotation_tree sale.order.tree sale.order tree New
view_sale_advance_payment_inv Invoice Order sale.advance.payment.inv form New
view_sale_order_calendar sale.order.calendar sale.order calendar New
view_sale_order_graph sale.order.graph sale.order graph New
view_sale_order_line_make_invoice Sales OrderLine Make Invoice sale.order.line.make.invoice form New
view_sale_order_make_invoice Create invoices sale.make.invoice form New
view_sales_config sale settings sale.config.settings div Inherits base_setup.view_sale_config_settings
view_sales_order_filter sale.order.list.select sale.order search New
view_sales_order_line_filter sale.order.line.select sale.order.line search New
view_sales_order_uninvoiced_line_filter sale.order.uninvoiced.line sale.order.line search New
Models touched (1)

New fields (0)

No new fields.

Public methods (4)
  • default_get(self, cr, uid, fields, context=None)
  • onchange_task_work(self, cr, uid, ids, task_work, context=None)
  • onchange_timesheet(self, cr, uid, ids, timesheet, context=None)
  • set_sale_defaults(self, cr, uid, ids, context=None)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/7.0/sale
VERSION
VERSION 1.0
CATEGORY
CATEGORYSales Management
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSRaphael Collet, Jagdish Panchal (Open ERP), Twinkle Christian (OpenERP), Cecile Tonglet, Rucha (Open ERP), Atul Patel (OpenERP), Jalpesh Patel (OpenERP), Randhir Mayatra (OpenERP), Stephane Wirtel, Odoo Translation Bot, Turkesh Patel (Open ERP), Numerigraphe - Lionel Sausin, Christophe Matthieu, Pinakin Nayi (OpenERP), Benoit Guillot, DBR (OpenERP), Harry (OpenERP), Antonin Bourguignon, pankita shah (Open ERP), ajay javiya (OpenERP), Martin Trigaux, Ajay Chauhan (OpenERP), Foram Katharotiya (OpenERP), Bhumika (OpenERP), Purnendu Singh (OpenERP), Saurang Suthar (OpenERP), Fabien Pinckaers, Antony Lesuisse, Bharat Devnani (OpenERP), Meera Trambadia (OpenERP), Saurang Suthar, Olivier Dony, Rajesh Prajapati (OpenERP), Twinkle (OpenERP), Divyesh Makwana (Open ERP), Tejas Tank, Thibault Delavallée, Vo Minh Thu, Hardik, Josse Colpaert, Arnaud Pineux, pso (OpenERP), Sbh (Openerp), Amit Patel (OpenERP), Launchpad Translations on behalf of openerp, vta vta@openerp.com, Quentin (OpenERP), Kuldeep Joshi (OpenERP), Nimesh (Open ERP), Denis Ledoux, Mayur Maheshwari (OpenERP), Jigar Amin - OpenERP, Sanjay Gohel (Open ERP), Alexis de Lattre, help, Fabien Meghazi, niv-openerp, Xavier ALT, Christophe Simonis, Ujjvala Collins (OpenERP), Jiten (OpenERP), Dharti Ratani (OpenERP), Goffin Simon, Khushboo Bhatt (Open ERP), dle@openerp.com, Bhumi Thakkar (Open ERP), Cedric Snauwaert, Amit Patel, Simon Lejeune, Frédéric van der Essen, Gilles Major, Chris Biersbach, Vishmita, Hardik Ansodariya, Dhruti Shastri (OpenERP), Yannick Vaucher, Ravish (Open ERP), Vidhin Mehta (OpenERP), csn-openerp, Amit (OpenERP), RGA(OpenERP), Najlaâ, Julien Legros, MVA, Stefan Rijnhart, Peter Langenberg, Juan Rial, Mohammed Shekha (OpenERP), florian da Costa, Thibault Delavallee
WEBSITE
WEBSITEhttp://www.openerp.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:43:10
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - account_voucher
    - account
    - base_setup
    - base
    - web_kanban
    - web
    - product
    - process
    - decimal_precision
    - mail
    - analytic
    - board
    - edi
    - email_template
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage sales quotations and orders
==================================

This application allows you to manage your sales goals in an effective and efficient manner by keeping track of all sales orders and history.

It handles the full sales workflow:

* **Quotation** -> **Sales order** -> **Invoice**

Preferences (only with Warehouse Management installed)
------------------------------------------------------

If you also installed the Warehouse Management, you can deal with the following preferences:

* Shipping: Choice of delivery at once or partial delivery
* Invoicing: choose how invoices will be paid
* Incoterms: International Commercial terms

You can choose flexible invoicing methods:

* *On Demand*: Invoices are created manually from Sales Orders when needed
* *On Delivery Order*: Invoices are generated from picking (delivery)
* *Before Delivery*: A Draft invoice is created and must be paid before delivery


The Dashboard for the Sales Manager will include
------------------------------------------------
* My Quotations
* Monthly Turnover (Graph)
    

Code Analysis

Views touched (27)
XML IDNameModelTypeStatus
board_sales_form board.sales.form board.board form New
crm_lead_partner_kanban_view res.partner.kanban.saleorder.inherit res.partner field Inherits base.res_partner_kanban_view
res_partner_address_type res.partner.view.address_type res.partner xpath Inherits base.view_partner_form
res_partner_view_buttons res.partner.view.buttons res.partner xpath Inherits base.view_partner_form
view_account_config account settings account.config.settings separator Inherits account.view_account_config_settings
view_order_form sale.order.form sale.order form New
view_order_form_editable_list sale.order.form.editable.list sale.order xpath Inherits sale.view_order_form
view_order_line_form2 sale.order.line.form2 sale.order.line form New
view_order_line_tree sale.order.line.tree sale.order.line tree New
view_order_product_graph sale.report.graph sale.report graph New
view_order_product_search sale.report.search sale.report search New
view_order_product_tree sale.report.tree sale.report tree New
view_order_tree sale.order.tree sale.order tree New
view_quotation_tree sale.order.tree sale.order tree New
view_sale_advance_payment_inv Invoice Order sale.advance.payment.inv form New
view_sale_order_calendar sale.order.calendar sale.order calendar New
view_sale_order_graph sale.order.graph sale.order graph New
view_sale_order_line_make_invoice Sales OrderLine Make Invoice sale.order.line.make.invoice form New
view_sale_order_make_invoice Create invoices sale.make.invoice form New
view_sales_config sale settings sale.config.settings div Inherits base_setup.view_sale_config_settings
view_sales_order_filter sale.order.list.select sale.order search New
view_sales_order_line_filter sale.order.line.select sale.order.line search New
view_sales_order_uninvoiced_line_filter sale.order.uninvoiced.line sale.order.line search New
view_shop_form sale.shop sale.shop form New
view_shop_tree sale.shop sale.shop tree New
view_turnover_by_month_graph turnover.by.month.graph account.invoice.report graph New
view_turnover_by_month_tree turnover.by.month.tree account.invoice.report tree New
Models touched (0)

No models found for this module.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/6.1/sale
VERSION
VERSION 1.0
CATEGORY
CATEGORYSales Management
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSRaphael Collet, Jagdish Panchal (Open ERP), Rucha (Open ERP), Stephane Wirtel, Numerigraphe - Lionel Sausin, Benoit Guillot, DBR (OpenERP), Harry (OpenERP), Fabien Pinckaers, Antony Lesuisse, Bharat Devnani (OpenERP), Meera Trambadia (OpenERP), Olivier Dony, Divyesh Makwana (Open ERP), Vo Minh Thu, pso (OpenERP), Launchpad Translations on behalf of openerp, Quentin (OpenERP), Mayur Maheshwari (OpenERP), Alexis de Lattre, vro, Fabien Meghazi, niv-openerp, Xavier ALT, Ujjvala Collins (OpenERP), Xavier Morel, Anael Closson, Khushboo Bhatt (Open ERP), Serpent Consulting Services, Amit (OpenERP), Minh Tran, Rifakat, Thibault Francois, Raphaël Valyi, Vaibhav (OpenERP), Carlos Vásquez, ksa (Open ERP), Husen Daudi, Els Van Vossel, Israel Fermin Montilla, Hardik Ansodariy (OpenERP), ssu, rch-openerp, Bharat (OpenERP), ARA (OpenERP), aag (OpenERP), ron@tinyerp.com, mtr, fp, qdp-launchpad@tinyerp.com, ksa (OpenERP), Mustufa Rangwala, psi (Open ERP), Tejas (OpenERP), Amit Parmar (OpenERP), RavishchanraMurari (Open ERP), Kirti Savalia (OpenERP), Hemendra Paregi (Open ERP), skh, Dhara (OpenERP), Atik Agewan (OpenERP), Ariel Figueroa, bde, arifmlpm@gmail.com
WEBSITE
WEBSITEhttp://www.openerp.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:41:35
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock
    - product
    - base
    - process
    - decimal_precision
    - account
    - base_setup
    - analytic
    - board
    - edi
    - email_template
    - mail
    - base_tools
    - procurement
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
The base module to manage quotations and sales orders.
======================================================

Workflow with validation steps:
-------------------------------
    * Quotation -> Sales order -> Invoice

Invoicing methods:
------------------
    * Invoice on order (before or after shipping)
    * Invoice on delivery
    * Invoice on timesheets
    * Advance invoice

Partners preferences:
---------------------
    * shipping
    * invoicing
    * incoterm

Products stocks and prices
--------------------------

Delivery methods:
-----------------
    * all at once
    * multi-parcel
    * delivery costs

Dashboard for Sales Manager that includes:
------------------------------------------
    * Quotations
    * Sales by Month
    * Graph of Sales by Salesman in last 90 days
    * Graph of Sales per Customer in last 90 days
    * Graph of Sales by Product's Category in last 90 days
    

Code Analysis

Views touched (33)
XML IDNameModelTypeStatus
board_sales_form board.sales.form board.board form New
board_sales_manager_form board.sales.manager.form board.board form New
mrp_company res.company.mrp.config res.company page Inherits base.view_company_form
stock_move_sale stock.move.form stock.move xpath Inherits stock.view_move_form
stock_picking_inherit_sale stock.picking.form stock.picking field Inherits stock.view_picking_form
stock_picking_out_inherit_sale Outgoing picking Inherited stock.picking field Inherits stock.view_picking_out_form
view_config_picking_policy Setup Your Invoicing Method sale.config.picking_policy data Inherits base.res_config_view_base
view_order_form sale.order.form sale.order form New
view_order_line_form2 sale.order.line.form2 sale.order.line form New
view_order_line_graph sale.order.line.graph sale.order.line graph New
view_order_line_tree sale.order.line.tree sale.order.line tree New
view_order_product_graph sale.report.graph sale.report graph New
view_order_product_search sale.report.search sale.report search New
view_order_product_tree sale.report.tree sale.report tree New
view_order_tree sale.order.tree sale.order tree New
view_sale_advance_payment_inv Advance Invoice sale.advance.payment.inv form New
view_sale_open_invoice Open Invoice sale.open.invoice form New
view_sale_order_calendar sale.order.calendar sale.order calendar New
view_sale_order_graph sale.order.graph sale.order graph New
view_sale_order_line_make_invoice Sales OrderLine Make Invoice sale.order.line.make.invoice form New
view_sale_order_make_invoice Create invoices sale.make.invoice form New
view_sales_by_month_tree view.sales.by.month.tree sale.report tree New
view_sales_by_partner_graph sales.by.partner.graph sale.report graph New
view_sales_by_salesman_graph sales.by.salesman.graph sale.report graph New
view_sales_order_filter sale.order.list.select sale.order search New
view_sales_order_line_filter sale.order.line.select sale.order.line search New
view_sales_order_uninvoiced_line_filter sale.order.uninvoiced.line sale.order.line search New
view_sales_product_total_price_graph sold.product.total.price.graph sale.report graph New
view_shop_form sale.shop sale.shop form New
view_shop_tree sale.shop sale.shop tree New
view_top_quotations_tree sale.top.quotations.tree sale.order tree New
view_turnover_by_month_graph turnover.by.month.graph account.invoice.report graph New
view_turnover_by_month_tree turnover.by.month.tree account.invoice.report tree New
Models touched (0)

No models found for this module.