[IMP] Sales: Added call out to PDF quote builder

closes odoo/documentation#15462

Signed-off-by: Megan Valenzuela (meval) <meval@odoo.com>
This commit is contained in:
meval1006​
2025-11-25 15:05:01 -08:00
parent b97dc8c165
commit ad9660eb2f
4 changed files with 75 additions and 63 deletions

View File

@@ -2,13 +2,13 @@
PDF quote builder PDF quote builder
================= =================
The *PDF Quote Builder* in Odoo *Sales* provides the opportunity to send customers a fully The *PDF Quote Builder* in Odoo **Sales** app provides the opportunity to send customers a fully
customized PDF file for quotes, showcasing the company and products, with various information and customized PDF file for quotes, showcasing the company and products, with various information and
design elements, instead of just showing the price and total. design elements, instead of showing the price and total.
The PDF Quote Builder groups header pages, product descriptions, the price(s), and footer pages to The PDF Quote Builder groups header pages, product descriptions, prices, and footer pages to create
create a detailed quote. It can also inject dynamic texts or custom notes in the PDF to personalize a detailed quote. It can also inject dynamic texts or custom notes in the PDF to personalize the
the offer for the customer. offer for the customer.
Having a customized PDF in quotes provides a heightened conclusion to the shopping experience for Having a customized PDF in quotes provides a heightened conclusion to the shopping experience for
customers, and adds an elegant level of professionalism to a company. customers, and adds an elegant level of professionalism to a company.
@@ -26,24 +26,34 @@ Configuration
In order to add custom PDF files for quotes, the :guilabel:`PDF Quote builder` feature *must* be In order to add custom PDF files for quotes, the :guilabel:`PDF Quote builder` feature *must* be
configured. configured.
To do that, navigate to :menuselection:`Sales app --> Configuration --> Settings`. Then, on the To do that, navigate to :menuselection:`Sales app --> Configuration --> Settings` and scroll to the
:guilabel:`Settings` page, scroll to the :guilabel:`Quotations & Orders` section, and locate the :guilabel:`Quotations & Orders` section. Tick the :guilabel:`PDF Quote builder` checkbox feature,
:guilabel:`PDF Quote builder` feature. then click :guilabel:`Save`.
Once enabled, a :icon:`oi-arrow-right` :guilabel:`(right arrow)` icon for
:guilabel:`Headers/Footers` appears beneath it.
Add PDF as Header/Footer Add PDF as Header/Footer
======================== ========================
In Odoo *Sales*, it's possible to add a custom PDF that can be used either as a header or a footer. .. important::
When the PDF quote builder is activated in a quotation, you can then select as many headers and Odoo does **not** allow PDF field names to have a space in them. Only use alphanumerics, hyphens,
footers as you wish to use, these PDF will then also be inserted in the final PDF. or underscores.
In Odoo **Sales** app allows for the addition a custom PDF, which serves as either as a header or a
footer. Activating the PDF quote builder in a quotation, enables the selection of multiple headers
and footers, which are inserted into the final PDF.
To add a custom PDF as header or footer, start by navigating to :menuselection:`Sales app --> To add a custom PDF as header or footer, start by navigating to :menuselection:`Sales app -->
Configuration --> Headers/Footers`. From this page, either click :guilabel:`New` or Configuration`. Click the :icon:`oi-arrow-right` :guilabel:`(right arrow)` icon for
:guilabel:`Upload`. :guilabel:`Headers/Footers` and all available templates appear in a default Kanban view.
Clicking :guilabel:`Upload` instantly provides the opportunity to upload the desired document. Then, Click :guilabel:`New` or :guilabel:`Upload`. Clicking :guilabel:`Upload` instantly provides the
the document can be further configured on the document card, or by clicking the opportunity to upload the desired document.
:icon:`fa-ellipsis-v` :guilabel:`(vertical ellipsis)` icon in the top right corner of the document
Then, the document can be further configured on the document card, or by clicking the
:icon:`fa-ellipsis-v` :guilabel:`(vertical ellipsis)` icon in the top-right corner of the document
card, and then clicking :guilabel:`Edit`. card, and then clicking :guilabel:`Edit`.
Clicking :guilabel:`New` reveals a blank documents form, in which the desired PDF can be uploaded Clicking :guilabel:`New` reveals a blank documents form, in which the desired PDF can be uploaded
@@ -57,19 +67,19 @@ grayed-out (not clickable) until a document is uploaded. Once a PDF has been upl
:guilabel:`Name` field is auto-populated with the name of the PDF, and it can then be edited. :guilabel:`Name` field is auto-populated with the name of the PDF, and it can then be edited.
Then, in the :guilabel:`Document Type` field, click the drop-down menu, and select either: Then, in the :guilabel:`Document Type` field, click the drop-down menu, and select either:
:guilabel:`Header`, or :guilabel:`Footer` to define whether these files would be selectable to be at :guilabel:`Header`, or :guilabel:`Footer` to define whether these files are selectable at the
the beginning or at the end of your quote. beginning or at the end of the quote.
Under this, in the :guilabel:`Quotation Templates` section, this PDF can be restricted quotation Under this, in the :guilabel:`Quotation Templates` section, this PDF can be restricted quotation
templates only. templates only.
.. note:: .. note::
Alternatively, you can also navigate to :menuselection:`Sales app --> Configuration --> Alternatively, navigate to :menuselection:`Sales app --> Configuration --> Quotation Templates`,
Quotation Templates`, select a template and directly :guilabel:`Add` or :guilabel:`Upload` a PDF select a template and directly :guilabel:`Add` or :guilabel:`Upload` a PDF to it in the
to it in the :guilabel:`Quote Builder` tab. :guilabel:`Quote Builder` tab.
Lastly, beside the :guilabel:`File Content` field, you have the possibility to Lastly, beside the :guilabel:`File Content` field, the :guilabel:`Configure dynamic fields` option
:guilabel:`Configure dynamic fields`. is available.
Dynamic text in PDFs Dynamic text in PDFs
==================== ====================
@@ -110,15 +120,14 @@ For product PDF:
- :guilabel:`tax_excl_price`: Tax Excluded Price - :guilabel:`tax_excl_price`: Tax Excluded Price
- :guilabel:`tax_incl_price`: Tax Included Price - :guilabel:`tax_incl_price`: Tax Included Price
After uploading a PDF, you can then :guilabel:`Configure dynamic fields`. This will allow you to map After uploading a PDF, click :guilabel:`Configure dynamic fields`. This allows the mapping of any
any field name found in your PDF to the field you want to show by writing down any existing path. field name found in the PDF to the desired displayed field by writing down any existing path.
Headers and footers starts from the current :guilabel:`sale_order` model, whereas product document Headers and footers start from the current *sale_order* model, while product documents follow their
follows their path from their :guilabel:`sale_order_line`. path from their :guilabel:`sale_order_line`. Leaving that path empty fills a custom note directly
Leaving that path empty allows you to fill a custom notes, directly from the specific quote that from the specific quote that requires it.
requires it.
.. example:: .. example::
When a PDF is built, it's best practice to use common dynamic text values (:guilabel:`name` and When a PDF is built, it is best practice to use common dynamic text values (:guilabel:`name` and
:guilabel:`partner_id_name`). When uploaded into the database, Odoo auto-populates those fields :guilabel:`partner_id_name`). When uploaded into the database, Odoo auto-populates those fields
with the information from their respective fields. with the information from their respective fields.
@@ -126,21 +135,28 @@ requires it.
text field, and the Customer Name in the :guilabel:`partner_id_name` field. text field, and the Customer Name in the :guilabel:`partner_id_name` field.
.. image:: pdf_quote_builder/pdf-quote-builder-sample.png .. image:: pdf_quote_builder/pdf-quote-builder-sample.png
:align: center
:alt: PDF quote being built using common dynamic placeholders. :alt: PDF quote being built using common dynamic placeholders.
Once the PDF file(s) are complete, save them to the computer's hard drive, and proceed to upload Once the PDF files are complete, save them to the computer's hard drive. Next, navigate to
them to Odoo via :menuselection:`Sales app --> Configuration --> Headers/Footers`. :menuselection:`Sales app --> Configuration --> Headers/Footers`, and click :guilabel:`Upload`.
Select the PDF file to be uploaded, then click :guilabel:`Open`. The PDF is added to the database,
and appears in the first Kanban card.
.. note::
The Kanban template cards can be rearranged by clicking and dragging the template into the
desired location.
.. example:: .. example::
When uploading PDF containing the form field :guilabel:`invoice_partner_country`, which is an When uploading PDF containing the form field :guilabel:`invoice_partner_country`, which is an
information available in the sales order, configure the :guilabel:`path` of the information available in the sales order, configure the :guilabel:`path` of the :guilabel:`Form
:guilabel:`Form Field Name` to: Field Name` to:
- :guilabel:`partner_invoice_id.country_id.name` for a header or footer document - :guilabel:`partner_invoice_id.country_id.name` for a header or footer document
- :guilabel:`order_id.partner_invoice_id.country_id.name` for a product document fills the form - :guilabel:`order_id.partner_invoice_id.country_id.name` for a product document fills the form
with the invoice partner country's name when the PDF is built. with the invoice partner country's name when the PDF is built.
.. example::
.. tip::
When uploading any PDF containing the form field :guilabel:`custom_note`, leaving the When uploading any PDF containing the form field :guilabel:`custom_note`, leaving the
:guilabel:`path` empty allows the seller to write down any note where that form field is in that :guilabel:`path` empty allows the seller to write down any note where that form field is in that
document and shown when the PDF is built. document and shown when the PDF is built.
@@ -148,11 +164,12 @@ them to Odoo via :menuselection:`Sales app --> Configuration --> Headers/Footers
Add PDF to product Add PDF to product
================== ==================
In Odoo *Sales*, it's also possible to add a custom PDF to a product form. When a PDF is added to a In the Odoo **Sales** app, it is also possible to add a custom PDF to a product form. When a PDF is
product, and that product is used in a quotation, that PDF is also inserted in the final PDF. added to a product, and that product is used in a quotation, that PDF is also inserted in the final
PDF.
To add a custom PDF to a product, start by navigating to :menuselection:`Sales app --> Products To add a custom PDF to a product, start by navigating to :menuselection:`Sales app --> Products -->
--> Products`, and select the desired product to add a custom PDF to. Products`, and select the desired product to add a custom PDF to.
.. note:: .. note::
A document could also be added to a product variant, instead of a product. If there are documents A document could also be added to a product variant, instead of a product. If there are documents
@@ -181,9 +198,6 @@ field.
PDF form configuration PDF form configuration
---------------------- ----------------------
.. image:: pdf_quote_builder/blank-document-form.png
:alt: A standard document form with various fields for a specific product in Odoo Sales.
The first field on the documents form is for the :guilabel:`Name` of the document, and it is The first field on the documents form is for the :guilabel:`Name` of the document, and it is
grayed-out (not clickable) until a document is uploaded. Once a PDF has been uploaded, the grayed-out (not clickable) until a document is uploaded. Once a PDF has been uploaded, the
:guilabel:`Name` field is auto-populated with the name of the PDF, and it can then be edited. :guilabel:`Name` field is auto-populated with the name of the PDF, and it can then be edited.
@@ -192,22 +206,22 @@ Prior to uploading a document, there's the option to designate whether the docum
:guilabel:`File` or :guilabel:`URL` from the :guilabel:`Type` drop-down field menu. :guilabel:`File` or :guilabel:`URL` from the :guilabel:`Type` drop-down field menu.
.. image:: pdf_quote_builder/document-form-uploaded-pdf.png .. image:: pdf_quote_builder/document-form-uploaded-pdf.png
:alt: A standard document form with an uploaded pdf in Odoo Sales. :alt: A standard document form with an uploaded PDF in Odoo Sales.
.. note:: .. note::
If a PDF is uploaded, the :guilabel:`Type` field is auto-populated to :guilabel:`File`, and it If a PDF is uploaded, the :guilabel:`Type` field is auto-populated to :guilabel:`File`, and it
cannot be modified. cannot be modified.
Then, in the :guilabel:`Sales` section, in the :guilabel:`Visible at` field, click the drop-down Then, in the :guilabel:`Sales` section, click the drop-down menu in the :guilabel:`Visible at`
menu, and select either: :guilabel:`On quotation`, :guilabel:`On confirmed order`, or field, and select either: :guilabel:`On quotation`, :guilabel:`On confirmed order`, or
:guilabel:`Inside quote pdf`. :guilabel:`Inside quote pdf`.
- :guilabel:`Quotation`: the document is sent to (and accessible by) customers at any time. - :guilabel:`Quotation`: The document is sent to (and accessible by) customers at any time.
- :guilabel:`Confirmed order`: the document is sent to customers upon the confirmation of an order. - :guilabel:`Confirmed order`: The document is sent to customers upon the confirmation of an order.
This is best for user manuals and other supplemental documents. This is best for user manuals and other supplemental documents.
- :guilabel:`Inside quote`: the document is included in the PDF of the quotation, between the header - :guilabel:`Inside quote`: The document is included in the PDF of the quotation, between the header
pages and the :guilabel:`Pricing` section of the quote. pages and the :guilabel:`Pricing` section of the quote.
.. example:: .. example::
@@ -218,13 +232,12 @@ menu, and select either: :guilabel:`On quotation`, :guilabel:`On confirmed order
.. image:: pdf_quote_builder/pdf-on-quote-sample.png .. image:: pdf_quote_builder/pdf-on-quote-sample.png
:alt: Sample of an uploaded pdf with the on quote option chosen in Odoo Sales. :alt: Sample of an uploaded pdf with the on quote option chosen in Odoo Sales.
Beside the :guilabel:`File Content` field, you have the possibility to Beside the :guilabel:`File Content` field, is the :guilabel:`Configure dynamic fields` option. When
:guilabel:`Configure dynamic fields`. When doing so, remember that the starting model is the doing so, remember that the starting model is the :guilabel:`sale_order_line`, unlike for headers
:guilabel:`sale_order_line`, unlike for headers and footers that start from the and footers that start from the :guilabel:`sale_order`.
:guilabel:`sale_order`.
Lastly, in the :guilabel:`E-Commerce` section, decide whether or not to Lastly, in the :guilabel:`E-Commerce` section, decide whether or not to :guilabel:`Publish on
:guilabel:`Publish on Website` so that the PDF appears on the product page in the online store. Website` so that the PDF appears on the product page in the online store.
.. example:: .. example::
When the :guilabel:`Publish on Website` option is enabled, a link to the uploaded document, When the :guilabel:`Publish on Website` option is enabled, a link to the uploaded document,
@@ -246,23 +259,22 @@ be filled in.
.. image:: pdf_quote_builder/quote-builder-headers.png .. image:: pdf_quote_builder/quote-builder-headers.png
:alt: Selectable quotation headers and footers under the Quote Builder section in a quotation. :alt: Selectable quotation headers and footers under the Quote Builder section in a quotation.
Once a quote with a pre-configured PDF has been confirmed, Odoo provides the option to print the Once a quote with a preconfigured PDF has been confirmed, Odoo provides the option to print the
confirmed quote to check for errors, or to keep for records. confirmed quote to check for errors, or to keep for records.
To print the PDF quote, navigate to the confirmed quote, and click the :guilabel:`⚙️ (gear)` icon to To print the PDF quote, navigate to the confirmed quote, and click :icon:`fa-cog`
reveal a drop-down menu. From this drop-down menu, select :guilabel:`Print`, then select :guilabel:`Actions` to reveal a drop-down menu. From this drop-down menu, select :guilabel:`Print`,
:guilabel:`PDF Quote`. then select :guilabel:`PDF Quote`.
.. image:: pdf_quote_builder/drop-down-print-pdf.png .. image:: pdf_quote_builder/drop-down-print-pdf.png
:alt: Print pdf quote option on drop-down menu located on confirmed sales order in Odoo Sales. :alt: Print PDF quote option on drop-down menu located on confirmed sales order in Odoo Sales.
Doing so instantly downloads the PDF quote. When opened, the PDF quote, along with the configured Doing so instantly downloads the PDF quote. When opened, the PDF quote, along with the configured
product PDF that was set to be visible inside the quote, can be viewed and printed. product PDF that was set to be visible inside the quote, can be viewed and printed.
.. note:: .. note::
Download these :download:`PDF quote builder examples Download these :download:`PDF quote builder examples
<pdf_quote_builder/pdfquotebuilderexamples.zip>` or download <pdf_quote_builder/pdfquotebuilderexamples.zip>` or download :download:`sample quotation
:download:`sample quotation
<pdf_quote_builder/sample_quotation.pdf>` for added reference. <pdf_quote_builder/sample_quotation.pdf>` for added reference.
.. seealso:: .. seealso::

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 15 KiB