Sales PDF Quotation Builder

sale_pdf_quote_builder
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/19.0/sale_pdf_quote_builder
VERSION
VERSION 0.1.0
CATEGORY
CATEGORYSales/Sales
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORSOdoo S.A.
MAINTAINERS
MAINTAINERSOdoo S.A.
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Xavier Morel, GitHub, Julien Castiaux, Victor Feyens, Alvaro Fuentes, Tiffany Chang (tic), Gorash, Demesmaeker, Valentin Chevalier, Moises Lopez - https://www.vauxoo.com/, Mylyna Hy, Mahamadasif Ansari, Levi Siuzdak (sile), Dylan Kiss (dyki), Emanuele, Adam Heinz, Louis (loti), Maxime de Neuville, kcv-odoo, aamo-odoo, Victor Miguel Armenta Carrillo, Pierre Lamotte (pila), Pierre Pulinckx, Bastien PIERRE, jeep-odoo, Shrey Mehta, Krzysztof Magusiak (krma), krip-odoo, utma-odoo, bhna-odoo, Nisarg (nipl), Lionel Piraux (lipi), saurabh, Hoan Hoang
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:51:44
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale_management
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - account_payment
    - account
    - onboarding
    - product
    - uom
    - analytic
    - portal
    - http_routing
    - auth_signup
    - digest
    - resource
    - payment
    - utm
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Build nice quotations

Code Analysis

Views touched (10)
XML IDNameModelTypeStatus
product_document_form product.document.form.sale product.document field Inherits product.product_document_form
quotation_document_form quotation.document.form quotation.document form New
quotation_document_kanban quotation.document.kanban quotation.document kanban New
quotation_document_list quotation.document.list quotation.document list New
quotation_document_search sale.pdf.form.field.search sale.pdf.form.field search New
quotation_document_search_view quotation.document.search quotation.document search New
res_config_settings_view_form res.config.settings.view.form.inherit.sale.pdf.quote.builder res.config.settings div Inherits sale_management.res_config_settings_view_form
sale_order_form_inherit_sale_pdf_quote_builder sale.order.form.pdf.quote.builder sale.order xpath Inherits sale_management.sale_order_form_quote
sale_order_template_form sale.order.template.form sale.order.template notebook Inherits sale_management.sale_order_template_view_form
sale_pdf_form_field_list sale.pdf.form.field.list sale.pdf.form.field list New
Models touched (7)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • attached_on_sale 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.\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. \nInside quote: The document will be included in the pdf of the quotation and sale order between the header pages and the quote table. " ondelete={'inside': 'set default'} selection_add=[('inside', 'Inside quote pdf')]
  • form_field_ids Many2many → sale.pdf.form.field
    comodel_name='sale.pdf.form.field' compute='_compute_form_field_ids' domain=[('document_type', '=', 'product_document')] store=True string='Form Fields Included'
Public methods (1)
  • action_open_pdf_form_fields(self)

New fields (7)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the header or footer without removing it.'
  • add_by_default Boolean
    default=False help='If checked, this header or footer will be added by default on new quotes.' string='Add By Default'
  • document_type Selection
    default='header' required=True selection=[('header', 'Header'), ('footer', 'Footer')] string='Document Type'
  • form_field_ids Many2many → sale.pdf.form.field
    comodel_name='sale.pdf.form.field' compute='_compute_form_field_ids' domain=[('document_type', '=', 'quotation_document')] store=True string='Form Fields Included'
  • ir_attachment_id Many2one → ir.attachment
    comodel_name='ir.attachment' ondelete='cascade' required=True string='Related attachment'
  • quotation_template_ids Many2many → sale.order.template
    check_company=True comodel_name='sale.order.template' groups='sales_team.group_sale_salesman' relation='header_footer_quotation_template_rel' string='Quotation Templates'
  • sequence Integer
    default=10
Public methods (2)
  • action_open_pdf_form_fields(self)
  • create(self, vals_list)
    @api.model_create_multi

New fields (4)
  • available_quotation_document_ids Many2many → quotation.document
    comodel_name='quotation.document' compute='_compute_available_quotation_document_ids' string='Available Quotation Documents'
  • customizable_pdf_form_fields Json
    readonly=False string='Customizable PDF Form Fields'
  • is_pdf_quote_builder_available Boolean
    compute='_compute_is_pdf_quote_builder_available'
  • quotation_document_ids Many2many → quotation.document
    check_company=True comodel_name='quotation.document' default=_default_quotation_document_ids readonly=False string='Headers/Footers'
Public methods (1)
  • get_update_included_pdf_params(self)

New fields (2)
  • available_product_document_ids Many2many → product.document
    comodel_name='product.document' compute='_compute_available_product_document_ids' compute_sudo=True relation='available_sale_order_line_product_document_rel' string='Available Product Documents'
  • product_document_ids Many2many → product.document
    comodel_name='product.document' domain="[('id', 'in', available_product_document_ids)]" help='The product documents for this order line that will be merged in the PDF quote.' readonly=False relation='sale_order_line_product_document_rel' string='Product Documents'
Public methods (0)

No public methods.

New fields (1)
  • quotation_document_ids Many2many → quotation.document
    check_company=True comodel_name='quotation.document' relation='header_footer_quotation_template_rel' string='Headers and footers'
Public methods (0)

No public methods.

New fields (5)
  • document_type Selection
    readonly=True required=True selection=[('quotation_document', 'Header/Footer'), ('product_document', 'Product Document')] string='Document Type'
  • name Char
    help='The form field name as written in the PDF.' readonly=True required=True string='Form Field Name'
  • path Char
    help='The path to follow to dynamically fill the form field. \nLeave empty to be able to customized it in the quotation form.' string='Path'
  • product_document_ids Many2many → product.document
    comodel_name='product.document' string='Product Documents'
  • quotation_document_ids Many2many → quotation.document
    comodel_name='quotation.document' string='Quotation Documents'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/18.0/sale_pdf_quote_builder
VERSION
VERSION 0.1.0
CATEGORY
CATEGORYSales/Sales
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Xavier Morel, GitHub, Odoo Online, Christophe Monniez, Julien Castiaux, Victor Feyens, Alvaro Fuentes, Tiffany Chang (tic), Gorash, Demesmaeker, Valentin Chevalier, Mylyna Hy, Mahamadasif Ansari, Pieter Claeys (clpi), Levi Siuzdak (sile), Dylan Kiss (dyki), Martin Maes, omra-odoo, Adam Heinz, Ethan Vincent, Louis (loti), vava-odoo, kcv-odoo, Lina (liew), sami odoo, Louis (wil), aamo-odoo, Manushi Shah, Pierre Lamotte (pila), Bastien PIERRE, Matias Peralta, krip-odoo, utma-odoo, bhna-odoo, Lionel Piraux (lipi), Mazen, Hoan Hoang
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:25:58
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale_management
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - account_payment
    - account
    - onboarding
    - product
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - payment
    - utm
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Build nice quotations

Code Analysis

Views touched (10)
XML IDNameModelTypeStatus
product_document_form product.document.form.sale product.document field Inherits product.product_document_form
quotation_document_form quotation.document.form quotation.document form New
quotation_document_kanban quotation.document.kanban quotation.document kanban New
quotation_document_list quotation.document.list quotation.document list New
quotation_document_search sale.pdf.form.field.search sale.pdf.form.field search New
quotation_document_search_view quotation.document.search quotation.document search New
res_config_settings_view_form res.config.settings.view.form.inherit.sale.pdf.quote.builder res.config.settings div Inherits sale_management.res_config_settings_view_form
sale_order_form_inherit_sale_pdf_quote_builder sale.order.form.pdf.quote.builder sale.order xpath Inherits sale_management.sale_order_form_quote
sale_order_template_form sale.order.template.form sale.order.template notebook Inherits sale_management.sale_order_template_view_form
sale_pdf_form_field_list sale.pdf.form.field.list sale.pdf.form.field list New
Models touched (7)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • attached_on_sale 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.\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. \nInside quote: The document will be included in the pdf of the quotation and sale order between the header pages and the quote table. " ondelete={'inside': 'set default'} selection_add=[('inside', 'Inside quote pdf')]
  • form_field_ids Many2many → sale.pdf.form.field
    comodel_name='sale.pdf.form.field' compute='_compute_form_field_ids' domain=[('document_type', '=', 'product_document')] store=True string='Form Fields Included'
Public methods (1)
  • action_open_pdf_form_fields(self)

New fields (6)
  • active Boolean
    default=True help='If unchecked, it will allow you to hide the header or footer without removing it.'
  • document_type Selection
    default='header' required=True selection=[('header', 'Header'), ('footer', 'Footer')] string='Document Type'
  • form_field_ids Many2many → sale.pdf.form.field
    comodel_name='sale.pdf.form.field' compute='_compute_form_field_ids' domain=[('document_type', '=', 'quotation_document')] store=True string='Form Fields Included'
  • ir_attachment_id Many2one → ir.attachment
    comodel_name='ir.attachment' ondelete='cascade' required=True string='Related attachment'
  • quotation_template_ids Many2many → sale.order.template
    check_company=True comodel_name='sale.order.template' relation='header_footer_quotation_template_rel' string='Quotation Templates'
  • sequence Integer
    default=10
Public methods (2)
  • action_open_pdf_form_fields(self)
  • create(self, vals_list)
    @api.model_create_multi

New fields (4)
  • available_product_document_ids Many2many → quotation.document
    comodel_name='quotation.document' compute='_compute_available_product_document_ids' string='Available Product Documents'
  • customizable_pdf_form_fields Json
    readonly=False string='Customizable PDF Form Fields'
  • is_pdf_quote_builder_available Boolean
    compute='_compute_is_pdf_quote_builder_available'
  • quotation_document_ids Many2many → quotation.document
    check_company=True comodel_name='quotation.document' readonly=False string='Headers/Footers'
Public methods (3)
  • get_update_included_pdf_params(self)
  • save_included_pdf(self, selected_pdf)
    Configure the PDF that should be included in the PDF quote builder for a given quote Note: self.ensure_one() :param dic selected_pdf: Dictionary of all the sections linked to their header_footer or product_document ids, in the format: { 'header': [doc_id], 'lines': [{line_id: [doc_id]}], 'footer': [doc_id] } :return: None
  • save_new_custom_content(self, document_type, form_field, content)
    Modify the content link to a form field in the custom content mapping of an order. Note: self.ensure_one() :param str document_type: The document type where the for field is. Either 'header_footer' or 'product_document'. :param str form_field: The form field in the custom content mapping. :param str content: The content of the form field in the custom content mapping. :return: None

New fields (2)
  • available_product_document_ids Many2many → product.document
    comodel_name='product.document' compute='_compute_available_product_document_ids' compute_sudo=True relation='available_sale_order_line_product_document_rel' string='Available Product Documents'
  • product_document_ids Many2many → product.document
    comodel_name='product.document' domain="[('id', 'in', available_product_document_ids)]" help='The product documents for this order line that will be merged in the PDF quote.' readonly=False relation='sale_order_line_product_document_rel' string='Product Documents'
Public methods (0)

No public methods.

New fields (1)
  • quotation_document_ids Many2many → quotation.document
    check_company=True comodel_name='quotation.document' relation='header_footer_quotation_template_rel' string='Headers and footers'
Public methods (0)

No public methods.

New fields (5)
  • document_type Selection
    readonly=True required=True selection=[('quotation_document', 'Header/Footer'), ('product_document', 'Product Document')] string='Document Type'
  • name Char
    help='The form field name as written in the PDF.' readonly=True required=True string='Form Field Name'
  • path Char
    help='The path to follow to dynamically fill the form field. \nLeave empty to be able to customized it in the quotation form.' string='Path'
  • product_document_ids Many2many → product.document
    comodel_name='product.document' string='Product Documents'
  • quotation_document_ids Many2many → quotation.document
    comodel_name='quotation.document' string='Quotation Documents'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/17.0/sale_pdf_quote_builder
VERSION
VERSION 0.1.0
CATEGORY
CATEGORYSales/Sales
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Odoo Online, Christophe Monniez, Tiffany Chang (tic), Demesmaeker, niyasraphy, Dylan Kiss (dyki), Ethan Vincent, vava-odoo, kcv-odoo, Louis (wil), Ryan Cen, Manushi Shah
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:02:08
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale_management
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - account_payment
    - account
    - onboarding
    - product
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - payment
    - utm
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Build nice quotations

Code Analysis

Views touched (2)
XML IDNameModelTypeStatus
res_config_settings_view_form res.config.settings.view.form.inherit.sale.pdf.quote.builder res.config.settings setting Inherits sale_management.res_config_settings_view_form
sale_order_template_form sale.order.template.form sale.order.template notebook Inherits sale_management.sale_order_template_view_form
Models touched (6)

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. \nInside quote: The document will be included in the pdf of the quotation \nand sale order between the header pages and the quote table. " selection_add=[('inside', 'Inside quote')]
Public methods (0)

No public methods.

New fields (4)
  • sale_footer Binary
    string='Footer pages'
  • sale_footer_name Char
  • sale_header Binary
    string='Header pages'
  • sale_header_name Char
Public methods (0)

No public methods.

New fields (4)
  • sale_footer Binary
    readonly=False related='company_id.sale_footer'
  • sale_footer_name Char
    readonly=False related='company_id.sale_footer_name'
  • sale_header Binary
    readonly=False related='company_id.sale_header'
  • sale_header_name Char
    readonly=False related='company_id.sale_header_name'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (4)
  • sale_footer Binary
    default=<expr> string='Footer pages'
  • sale_footer_name Char
    default=<expr>
  • sale_header Binary
    default=<expr> string='Header pages'
  • sale_header_name Char
    default=<expr>
Public methods (0)

No public methods.