TIP: You can type at any time to perform a new search.

Security findings

Repository
odoo/odoo · module folder
Module version
1.2
Category
Sales/Sales
Folder size
15.75 MB
License
LGPL-3
Application
No
Auto-installable
No
Website
None
Last tracking update
2026-10-05 00:19:50
Authors
Odoo S.A.
Maintainers
Odoo S.A.
Committers
Xavier Morel, Xavier ALT, Raphael Collet, Thibault Delavallée, odoo, Odoo Translation Bot, Christophe Matthieu, Joren Van Onder, qdp-odoo, Aaron Bohy, Géry Debongnie, Odoo Online, Arnold Moyaux, Julien Castiaux, Aurélien Warnon, Xavier-Do, Victor Feyens, Adrien Dieudonné, William Henrotin, Julien Mougenot, Anh Thao Pham (pta), svs-odoo, Prakash Prajapati, Rémy Voet (ryv), Tiffany Chang (tic), Gorash, Pierre Paridans, Romain Estievenart, Miquel Raïch, william-andre, Víctor Martínez, John Laterre (jol), Antoine Vandevenne (anv), luvi, Renaud Thiry, Vincent Larcin, Victor Piryns (pivi), amdi-odoo, Yosua Nicolaus, Levi Siuzdak (sile), Dylan Kiss (dyki), Jinane Maksoud, Chong Wang (cwg), Anita (anko), Xavier Bol (xbo), Brieuc-brd, Sarah Bellefroid, Arnaud Sibille, omra-odoo, Andrzej(pian), Quentin Wolfs, Louis (loti), reka-odoo, Julien Carion (juca), kcv-odoo, odoostan, mano-odoo, Harsh Shah, thle-odoo, Patricia Daloze (pda), Xavier Luyckx (xlu), guce, Elisabeth Dickinson, Stéphane Diez, dhha-odoo, Claire (clbr), Antoine (anso), Abdo Mongy, Léo Gizard, Hesham Saleh, Saif (segn), dija-odoo, AhmedElemary57, roto-odoo, Trinh Ngoc Hung, David Van Droogenbroeck (DROD), pkgu-odoo, Mohammad Abdulmoneim (abdu), djameltouati, khsr-odoo, Pierre Lamotte (pila), Pierre Pulinckx, Michaël Mattiello, Corentin Heinix (cohe), Allesio, Valeriya (vchu), Shrey Mehta, Carmine, pish-odoo, Mahdi Alijani (malj), anko-odoo, bona-odoo, lse-odoo, Krzysztof Magusiak (krma), devp-odoo, Florian Malfroid, Omar (OSAH), Ajit Singh, Armin-FalDiS, krip-odoo, Hazem Ibrahim, Maeva De Keyser (MDEK), utma-odoo, Tyler Landivar (tylan), nsirjacobs, bhna-odoo, defl, igbe, Lancelot Semal, Laurent Smet (LAS), Julien Launois (jula), Laetitia (ldau), Yagnik ✗ (yagp), path-odoo, Waleed Elgamal, steji, malb, Saurabh, Victor Decleire, Amr Elkhatieb, Nisarg (nipl), assh-odoo, cro, Leila Kerroum Balaguer, Lionel Piraux (lipi), livaios, Ai Lin Zuccarello (aizu), YoussefM890, maap-odoo, Ravij Parikh, Arnav Varshney, jand-odoo, Merlin Guillaume, Mazen, srap-odoo, pkri-odoo, Omar Khalil (omkha), assk-odoo, Séna Nshimiyimana, Atovange, Zachary (zavan), sako-odoo, Youssef (abyo), alan-odoo, Kadam Darji, soza-odoo, mson-odoo, Julien Carion, ELCO, Moamen(msho), Khaj-odoo, khaj-odoo, chpa-odoo, Oussema Heni, Krishna Patel, Sanket Tank(stan), Abdullah (abye), vifu-odoo, jeanschoenlaub, Laura (yanla), makb-odoo, djhan, Mark Orban (maorb), keluu-odoo, Julien Piron, Lucas Gvasalia, Jean Schoenlaub, Corentin Deruyck, pusu-odoo, Ahmed Hamila, Cezar Bulancea (cebul), mekot-odoo, patsh-odoo, lkerroum
Odoo dependencies
Python dependencies
None
System dependencies
None
Required by
delivery, l10n_br_sales, l10n_din5008_sale, l10n_ec_sale, l10n_fi_sale, l10n_gr_edi_delivery_note, l10n_in_sale, l10n_it_edi_doi, l10n_it_edi_sale, l10n_kr_sale, l10n_ph_sale, l10n_tw_edi_ecpay_sale, mass_mailing_sale, partnership, sale_crm, sale_edi_ubl, sale_gelato, sale_loyalty, sale_management, sale_product_matrix, sale_purchase, sale_sms, sale_stock, spreadsheet_dashboard_sale, storage_image_product, website_sale
Description
This module contains all the common features of Sales Management and eCommerce.
    

Code Analysis info_outline

Views touched (81)
XML IDNameModelTypeStatus
account_invoice_form Account Invoice account.move form Inherits account.view_move_form
account_invoice_groupby_inherit account.move.groupby account.move Inherits account.view_account_invoice_filter
account_invoice_report_view_tree account.invoice.report.view.list.inherit.sale account.invoice.report list Inherits account.account_invoice_report_view_tree
account_invoice_view_tree account.move.list.inherit.sale account.move list Inherits account.view_invoice_tree
crm_team_view_kanban_dashboard crm.team.view.kanban.dashboard.inherit.sale crm.team kanban 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_form_hide_tokens_heading payment_form_hide_tokens_heading ir.ui.view qweb Inherits payment.form
payment_link_wizard_view_form payment.link.wizard.form payment.link.wizard form Inherits payment.payment_link_wizard_view_form
payment_provider_form payment.provider.form.inherit.sale payment.provider form 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_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 form Inherits product.product_document_form
product_document_kanban product.document.kanban.sale product.document kanban Inherits product.product_document_kanban
product_document_list product.document.list.sale product.document list 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 form Inherits product.product_normal_form_view
product_product_sale_tree_view product.product.sale.list product.product list Inherits product.product_product_tree_view
product_template_form_view product.template.form.view.inherit.sale product.template form Inherits product.product_template_form_view
product_template_form_view_sale product.template.sale.property.form.inherit product.template form Inherits product.product_template_form_view
product_template_form_view_sale_order_button product.template.sale.order.button product.template form Inherits product.product_template_only_form_view
product_template_sale_tree_view product.template.sale.list product.product list Inherits product.product_template_tree_view
product_template_view_form product.template.form.inherit.sale.product.configurator product.template form Inherits product.product_template_form_view
product_view_kanban_catalog product.view.kanban.catalog.inherit.sale product.product kanban Inherits product.product_view_kanban_catalog
product_view_search_catalog product.view.search.catalog.inherit.sale product.product search 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 form Inherits base.res_config_settings_view_form
res_config_settings_view_form_sale_inherit res.config.settings.view.form.inherit.sale res.config.settings form Inherits account.res_config_settings_view_form
res_partner_view_buttons res.partner.view.buttons res.partner form Inherits base.view_partner_form
res_partner_view_form_payment_defaultcreditcard res.partner.view.form.payment.defaultcreditcard res.partner form Inherits payment.view_partners_form_payment_defaultcreditcard
res_partner_view_form_property_inherit res.partner.view.form.property.inherit res.partner form 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_kanban_with_dashboard sale.order.kanban.dashboard sale.order kanban Inherits sale.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_list_with_dashboard sale.order.list.quotation.dashboard sale.order list Inherits sale.view_quotation_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 search Inherits sale.view_sales_order_filter
sale_order_view_search_inherit_sale sale.order.search.inherit.sale sale.order search 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 form Inherits payment.payment_transaction_form
utm_campaign_view_form utm.campaign.view.form utm.campaign form Inherits utm.utm_campaign_view_form
utm_campaign_view_kanban utm.campaign.view.kanban utm.campaign kanban Inherits utm.utm_campaign_view_kanban
view_account_invoice_report_search_inherit account.invoice.report.search.inherit account.invoice.report search Inherits account.view_account_invoice_report_search
view_analytic_lines_service_list account.analytic.line.service.list account.analytic.line list New
view_analytic_lines_service_search account.analytic.line.services.search account.analytic.line search New
view_category_property_form product.category.property.form.inherit.sale product.category form Inherits account.view_category_property_form
view_order_form sale.order.form sale.order form New
view_order_form_mandatory_product sale.order.form.mandatory.product sale.order form Inherits sale.view_order_form
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_partner_tree_inherit res.partner.list.inherit res.partner list Inherits base.view_partner_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
HTTP endpoints (14)
Route(s)HandlerAuthTypeMethodsFlags
/my/orders, /my/orders/page/<int:page> CustomerPortal.portal_my_orders user http ALL website
/my/quotes, /my/quotes/page/<int:page> CustomerPortal.portal_my_quotes user http ALL website
/my/orders/<int:order_id>/download_edi CustomerPortal.portal_my_sale_order_download_edi public http ALL website
/my/orders/<int:order_id> CustomerPortal.portal_order_page public http ALL website
/my/orders/<int:order_id>/accept CustomerPortal.portal_quote_accept public jsonrpc ALL sudo website
/my/orders/<int:order_id>/decline CustomerPortal.portal_quote_decline public http POST website
/my/orders/<int:order_id>/document/<int:document_id> CustomerPortal.portal_quote_document public http ALL sudo
/my/orders/<int:order_id>/transaction PaymentPortal.portal_order_transaction public jsonrpc ALL
(inherited route override) SaleComboConfiguratorController.sale_combo_configurator_get_data user jsonrpc ALL sudo
(inherited route override) SaleComboConfiguratorController.sale_combo_configurator_get_price user jsonrpc ALL
(inherited route override) SaleProductConfiguratorController.sale_product_configurator_create_product user jsonrpc POST
(inherited route override) SaleProductConfiguratorController.sale_product_configurator_get_optional_products user jsonrpc ALL
(inherited route override) SaleProductConfiguratorController.sale_product_configurator_get_values user jsonrpc ALL
(inherited route override) SaleProductConfiguratorController.sale_product_configurator_update_combination user jsonrpc POST
Models touched (30)

New fields (0)

No new fields.

Public methods (0)

No public methods.

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

No public methods.

New fields (3)
  • order_id Many2one → sale.order
    comodel_name='sale.order' compute='_compute_order_id' index=True init_storage=<expr> readonly=False store=True string='Customer Order'
  • reinvoice_move_id Many2one → account.move
    comodel_name='account.move' copy=False help='Invoice created from related SO line' index='btree_not_null' readonly=True string='Invoice'
  • so_line Many2one → sale.order.line
    comodel_name='sale.order.line' compute='_compute_so_line' domain=<expr> index='btree_not_null' init_storage=<expr> readonly=False store=True string='Sales Order Item'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (2)
  • source_id Many2one → utm.source
    comodel_name='utm.source' readonly=True string='Source'
  • team_id Many2one → crm.team
    comodel_name='crm.team' string='Sales Team'
Public methods (0)

No public methods.

New fields (7)
  • 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.' string='Sale Warning'
  • service_line_count Integer
    compute='_compute_service_line_count' compute_sudo=True
  • 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 (6)
  • action_post(self)
  • action_view_services_analytic_lines(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
    column1='invoice_line_id' column2='order_line_id' comodel_name='sale.order.line' copy=False readonly=True relation='sale_order_line_invoice_rel' string='Sales Order Lines'
  • 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 (1)
  • sale_order_count Integer
    compute='_compute_sale_order_count' string='# Sale Orders'
Public methods (1)
  • action_primary_channel_button(self)

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
    column1='transaction_id' column2='sale_order_id' comodel_name='sale.order' copy=False readonly=True relation='sale_order_transaction_rel' string='Sales Orders'
  • 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 (4)
  • property_account_invoiced_not_delivered_active Boolean
    related='property_account_invoiced_not_delivered_id.active' string='Invoiced Not Delivered Account Active'
  • property_account_invoiced_not_delivered_id Many2one → account.account
    check_company=True company_dependent=True help='Account holding the accrued value of the goods invoiced but not delivered yet. With perpetual valuation, it counterbalances the stock valuation account at closing.' ondelete='restrict' args: 'account.account', 'Invoiced Not Delivered Account'
  • property_account_invoices_to_issue_active Boolean
    related='property_account_invoices_to_issue_id.active' string='Invoices to be Issued Account Active'
  • property_account_invoices_to_issue_id Many2one → account.account
    check_company=True company_dependent=True help='Account holding the accrued value of the goods delivered but not invoiced yet. With perpetual valuation, it counterbalances the stock valuation account at closing.' ondelete='restrict' args: 'account.account', 'Invoices to be Issued Account'
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.\nFrom Quotation: 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', 'Never'), ('quotation', 'From Quotation'), ('sale_order', 'On Order Confirmation')] string='Accessible'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

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

New fields (8)
  • 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 required=True selection=SALE_INVOICE_POLICY 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'
  • reinvoice_policy Selection
    compute='_compute_reinvoice_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', 'At Sales price')] store=True string='Re-Invoice Costs'
  • sale_delay Integer
    company_dependent=True default=0 help="Delivery lead time, in days. It's the number of days, promised to the customer, between the confirmation of the sales order and the delivery." args: 'Delivery Time'
  • 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_reinvoice_policy Boolean
    compute='_compute_visible_reinvoice_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)
    Override of `product` to provide additional data. The product configurator also has to be opened when the template has optional products, regardless of whether the template is configurable or not. Also, depending on the product type, the combo configurator might be needed instead of the standard product configurator.

New fields (13)
  • account_invoiced_not_delivered_id Many2one → account.account
    check_company=True string='Invoiced Not Delivered Account' args: 'account.account'
  • account_invoices_to_issue_id Many2one → account.account
    check_company=True string='Invoices to be Issued Account' args: 'account.account'
  • display_product_images_on_so Boolean
    string='Display Product Images'
  • 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'
  • 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_automatic_invoice Boolean
    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 Invoicing'
  • 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_invoice_policy Selection
    default='order' required=True selection=SALE_INVOICE_POLICY string='Invoicing Policy'
  • 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'
  • show_sol_numbers Boolean
    help='Display line numbers on Sales Orders.' string='Line Numbers'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (26)
  • display_product_images_on_so Boolean
    readonly=False related='company_id.display_product_images_on_so'
  • downpayment_account_active Boolean
    related='downpayment_account_id.active' string='Down payment Account Active'
  • 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_services_and_material Boolean
    implied_group='sale.group_services_and_material' string='Services & Materials'
  • 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_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_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'
  • sale_automatic_invoice Boolean
    readonly=False related='company_id.sale_automatic_invoice'
  • sale_invoice_policy Selection
    readonly=False related='company_id.sale_invoice_policy'
  • sale_order_mandatory_product Boolean
    config_parameter='sale.mandatory_product' string='Mandatory Product'
  • show_sol_numbers Boolean
    readonly=False related='company_id.show_sol_numbers' string='Line Numbers'
Public methods (2)
  • action_sale_start_payment_onboarding(self)
  • set_values(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (5)
  • incoterm_id Many2one → account.incoterms
    comodel_name='account.incoterms' help='International Commercial Terms are a series of predefined commercial terms used in international transactions.' string='Incoterm'
  • incoterm_location Char
    string='Incoterm Location'
  • 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 (0)

No public methods.

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'
  • allow_invoice_overages Boolean
    compute='_compute_allow_invoice_overages'
  • 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'
  • invoice_overages Boolean
    compute='_compute_invoice_overages' inverse='_inverse_invoice_overages'
  • 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 (77)
  • 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_unpaid Monetary
    compute='_compute_amount_unpaid' help='Amount left to pay to avoid double payment or double invoicing.' store=True string='Amount Remaining'
  • amount_untaxed Monetary
    compute='_compute_amounts' store=True string='Untaxed Amount' tracking=5
  • analytic_account_id Many2one → account.analytic.account
    comodel_name='account.analytic.account' string='Analytic Account'
  • 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='Promised Delivery'
  • 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'
  • delivery_date Datetime
    compute='_compute_delivery_date' string='Delivery Date'
  • delivery_status Selection
    compute='_compute_delivery_status' help='Blue: Not Delivered/Started\n Orange: Partially Delivered\n Green: Fully Delivered' store=True string='Delivery Status' args: [('pending', 'Not Delivered'), ('started', 'Started'), ('partial', 'Partially Delivered'), ('full', 'Fully Delivered')]
  • document_tax_mode Selection
    compute='_compute_document_tax_mode' precompute=True readonly=False required=True selection=[('tax_excluded', 'Tax Excl.'), ('tax_included', 'Tax Incl.')] store=True
  • 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'
  • extra_total_fields Json
    compute='_compute_extra_total_fields'
  • 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'
  • has_overages Boolean
    compute='_compute_has_overages'
  • incoterm Many2one → account.incoterms
    comodel_name='account.incoterms' compute='_compute_incoterm' help='International Commercial Terms are a series of predefined commercial terms used in international transactions.' precompute=True readonly=False store=True string='Incoterm'
  • incoterm_location Char
    compute='_compute_incoterm_location' precompute=True readonly=False store=True string='Incoterm Location'
  • 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_overages Boolean
  • invoice_status Selection
    compute='_compute_invoice_status' selection=INVOICE_STATUS store=True string='Invoice Status'
  • invoicing_closed Boolean
    copy=False help='If enabled, the order is considered fully invoiced regardless of lines.' string='Manually Closed For Invoicing'
  • is_expired Boolean
    compute='_compute_is_expired' search='_search_is_expired' string='Is Expired'
  • is_unfulfilled Boolean
    search='_search_is_unfulfilled' store=False string='Unfulfilled Orders'
  • journal_id Many2one → account.journal
    check_company=True comodel_name='account.journal' 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='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' inverse='_inverse_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_amount Monetary
    compute='_compute_prepayment_amount' currency_field='currency_id' help='The amount that must be paid by the customer to confirm the order.' inverse='_inverse_prepayment_amount' readonly=False string='Prepayment Amount'
  • prepayment_percent Float
    compute='_compute_prepayment_percent' help='The percentage of the amount that must be paid by the customer to confirm the order.' precompute=True readonly=False store=True string='Prepayment'
  • 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, the prices of all order lines will be updated accordingly.' 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_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_ship_button Boolean
    compute='_compute_show_ship_button'
  • show_sol_numbers Boolean
    related='company_id.show_sol_numbers'
  • 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 Json
    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_count Integer
    compute='_compute_transaction_count'
  • 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 quotation. After this date, you will no longer be able to sign and pay it.' precompute=True readonly=False store=True string='Expiration'
Public methods (28)
  • action_cancel(self)
    Cancel sales order and related draft invoices.
  • action_close_invoicing(self)
    Mark sales orders as manually closed for invoicing.
  • action_confirm(self)
    Confirm the given quotation(s) and set their confirmation dates. 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)
    Open 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_reopen_order(self)
    Reopen invoicing for manually closed sales orders.
  • action_unlock(self)
  • action_view_invoice(self, invoices=False)
    @api.readonly
  • action_view_payment_transaction(self)
  • batch_onchange_sol(self, lines_data, order_changes, fields_spec)
    @api.model
    Batch `sale.order.line` onchange calls into a single RPC. :param dict lines_data: {line_id: {"ids", "changes", "field_name"}}, one entry per line :param dict fields_spec: onchange fields spec, shared by every line :return: {line_id: recomputed values} :rtype: dict
  • 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
  • deliver_sold_quantity(self)
  • 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.
  • retrieve_sale_dashboard(self, period_days)
    @api.model
    Retrieve statistics for the Sales dashboard for a given period (number of days). :param int period_days: The number of days used to filter orders. :return: A dictionary containing all computed dashboard statistics. :rtype: dict
  • 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 (82)
  • accrual_move_ids Many2many → account.move
    column1='order_line_id' column2='move_id' comodel_name='account.move' copy=False help="Accrual entries generated for this line, so it isn't accrued again while one is still standing (posted, not yet reversed or cancelled)." relation='sale_order_line_accrual_move_rel' string='Accrual Entries'
  • 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 Integer
    compute='_compute_customer_lead' help='Number of days between the order confirmation and the shipping of the products' precompute=True readonly=False required=True store=True string='Lead Time'
  • deferred_revenue Boolean
    search='_search_deferred_revenue' store=False string='Deferred Revenue'
  • discount Float
    compute='_compute_discount' digits='Discount' precompute=True readonly=False store=True string='Discount (%)'
  • display_qty_widget Boolean
    compute='_compute_display_qty_widget'
  • display_type Selection
    default=False selection=[('line_section', 'Section'), ('line_subsection', 'Subsection'), ('line_note', 'Note')]
  • document_tax_mode Selection
    related='order_id.document_tax_mode'
  • 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_policy Selection
    compute='_compute_invoice_policy' search='_search_invoice_policy' selection=[('order', 'Ordered quantities'), ('delivery', 'Delivered quantities')] string='Invoicing Policy'
  • 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'
  • invoice_to_be_issued Boolean
    search='_search_invoice_to_be_issued' store=False string='Invoice to be Issued'
  • 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'
  • is_storable Boolean
    related='product_id.is_storable'
  • label Text
    compute='_compute_label' inverse='_inverse_label' string='Label'
  • 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
  • mandatory_product Boolean
    compute='_compute_mandatory_product' string='Is Product Mandatory'
  • name Text
    compute='_compute_name' precompute=True readonly=False 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)] if allowed_uom_ids or mandatory_product else []" 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_available_today Float
    compute='_compute_qty_at_date'
  • 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 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_delivered_percent Float
    compute='_compute_qty_delivered_percent' readonly=False string='Delivered (%)'
  • 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_overage Float
    compute='_compute_qty_overage' digits='Product Unit'
  • 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'
  • scheduled_date Datetime
    compute='_compute_qty_at_date' string='Delivery Date'
  • section_qty Float
    compute='_compute_section_qty' digits='Product Unit' precompute=True readonly=False store=True string='Section Quantity'
  • section_uom_id Many2one → uom.uom
    comodel_name='uom.uom' compute='_compute_section_uom_id' precompute=True readonly=False store=True string='Section Unit of Measure'
  • 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
  • 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_available_at_date Float
    compute='_compute_qty_at_date' digits='Product Unit'
  • virtual_id Char
Public methods (5)
  • 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
  • onchange(self, values, field_names, fields_spec)
  • write(self, vals)

New fields (43)
  • 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'
  • line_name Char
    readonly=True string='Order Line Name'
  • 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_tag_ids Many2many
    readonly=True related='partner_id.category_id' string='Customer Tags'
  • 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 Monetary
    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'
  • untaxed_delivered_amount Monetary
    readonly=True string='Untaxed Amount Delivered'
  • user_id Many2one → res.users
    comodel_name='res.users' readonly=True string='Salesperson'
  • utm_reference Reference
    selection='_selection_target_model' string='UTM Reference'
  • volume Float
    readonly=True string='Volume'
  • weight Float
    readonly=True string='Gross Weight'
Public methods (1)
  • action_open_order(self)
    @api.readonly

New fields (3)
  • currency_id Many2one → res.currency
    compute='_compute_currency_id' compute_sql='_compute_sql_currency_id' compute_sudo=True string='Currency' args: 'res.currency'
  • invoiced_amount Monetary
    compute='_compute_sale_invoiced_amount' compute_sudo=True currency_field='currency_id' 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)

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…