Compare commits

...

7 Commits

Author SHA1 Message Date
Mathieu Duckerts-Antoine 22daa15a25 [ADD] search panel: document new field attribute "depth"
We document the new attribute "depth" available for search panel fields of type
"category" introduced in https://github.com/odoo/odoo/pull/198733.

Task ID: 4579118
2025-02-21 11:37:38 +01:00
dikd-odoo 8c685239b4 [IMP] sales: gelato feedback
Apply suggestions from JERO review

edits

closes odoo/documentation#12123

X-original-commit: e32f4ec766
Signed-off-by: Zachary Straub (zst) <zst@odoo.com>
Co-authored-by: Jess Rogers <104637850+jero-odoo@users.noreply.github.com>
2025-02-21 08:16:00 +00:00
Logan Staelens 224e1f5982 [IMP] account_reports: Unambiguous cross_report aggregations
Before this commit, when using cross_report subformula it would search for a report that has an line with this code.
We had to ensure there was no duplicate codes and so it was difficult to maintain.

Now, when we use a cross_report subformula, we need to explicitly target the report from where the code is from.

task-4457667

closes odoo/documentation#11747

Related: odoo/odoo#193106
Related: odoo/enterprise#76845
Signed-off-by: Logan Staelens (lost) <lost@odoo.com>
2025-02-20 18:06:43 +00:00
Charles Mutabazi 606b56ccda [FIX] Use <chatter> instead of <div class="oe_chatter">
closes odoo/documentation#12110

X-original-commit: 0ae856bcf6
Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
2025-02-20 01:32:49 +00:00
jero-odoo c1154c0c5d [ADD] Purchase: Templates
closes odoo/documentation#12103

X-original-commit: 5bb043bd3b
Signed-off-by: Jessica Rogers (jero) <jero@odoo.com>
Co-authored-by: dikd-odoo <dikd@odoo.com>
Co-authored-by: Felicia Kuan <feku@odoo.com>
Co-authored-by: Sam Lieber (sali) <36018073+samueljlieber@users.noreply.github.com>
2025-02-19 08:13:54 +00:00
dikd-odoo cd3086cea4 [ADD] sales: gelato integration
edit image sizes

edits

Apply suggestions from FEKU review

edits

Apply suggestions from FEKU review

edits

Apply suggestions from FEKU review

edits

Update content/applications/sales/sales/gelato.rst

edits

Apply suggestions from ZST review

edits

edits

sales file

Apply suggestions from SALI review

Apply suggestions from SALI review2

images

Edits

closes odoo/documentation#12090

X-original-commit: c0dd6b7d1c
Signed-off-by: Dina Klarisse Dugar (dikd) <dikd@odoo.com>
Signed-off-by: Zachary Straub (zst) <zst@odoo.com>
Co-authored-by: Felicia Kuan <feku@odoo.com>
Co-authored-by: Felicia Kuan <feku@odoo.com>
Co-authored-by: Felicia Kuan <feku@odoo.com>
Co-authored-by: Felicia Kuan <feku@odoo.com>
Co-authored-by: Zachary Straub <zst@odoo.com>
Co-authored-by: Sam Lieber (sali) <36018073+samueljlieber@users.noreply.github.com>
Co-authored-by: Sam Lieber (sali) <36018073+samueljlieber@users.noreply.github.com>
2025-02-19 08:13:50 +00:00
xpl-odoo cc4e3a87f6 [IMP] accounting: clarify invoice sequence format
task-4564980

closes odoo/documentation#12100

X-original-commit: d2c610179a
Signed-off-by: Xavier Platteau (xpl) <xpl@odoo.com>
2025-02-19 05:31:02 +00:00
18 changed files with 296 additions and 52 deletions
@@ -7,8 +7,7 @@ Customer invoices
A customer invoice is a document issued by a company for products and/or services sold to a
customer. It records receivables as they are sent to customers. Customer invoices can include
amounts due for the goods and/or services provided, applicable sales taxes, shipping and handling
fees, and other charges.
Odoo supports multiple invoicing and payment workflows.
fees, and other charges. Odoo supports multiple invoicing and payment workflows.
.. seealso::
:doc:`/applications/finance/accounting/customer_invoices/overview`
@@ -84,14 +83,14 @@ Invoice confirmation
Click :guilabel:`Confirm` when the invoice is completed. The invoice's status changes to
:guilabel:`Posted`, and a journal entry is generated based on the invoice configuration. On
confirmation, Odoo assigns each invoice a unique number from a defined
:ref:`sequence <accounting/invoice/sequence>`.
confirmation, Odoo assigns each invoice a unique number from a defined :ref:`sequence
<accounting/invoice/sequence>`.
.. note::
- Once confirmed, an invoice can no longer be updated. Click :guilabel:`Reset to draft` if
changes are needed.
- If required, invoices and other journal entries can be locked once posted
using the :ref:`Secure posted entries with hash <data-inalterability/restricted>` feature.
- If required, invoices and other journal entries can be locked once posted using the
:ref:`Secure posted entries with hash <data-inalterability/restricted>` feature.
.. _accounting/invoice/sending:
@@ -174,53 +173,45 @@ same customer, the actions are performed on the most overdue invoice.
.. _accounting/invoice/sequence:
Sequence
========
Invoice sequence
================
Odoo assigns each document a unique sequence made up of a prefix and a number. The prefix combines
the journal code and the entry date and groups entries by period. The number is unique for each
period and is used to identify the entry. The default sequence on customer invoices is
INV/YYYY/number. In some specific cases, :ref:`resequencing <accounting/invoice/resequencing>`
invoices might be necessary.
When confirming an invoice, Odoo generates a unique invoice reference number. By default, Odoo uses
the following sequence format `INV/year/incrementing-number` (e.g., `INV/2025/00001`), which
restarts from `00001` each year.
However, it is possible to :ref:`change the sequence format <accounting/invoice/resequencing>` and
its periodicity, and to :ref:`mass-resequence invoices <accounting/invoice/mass-resequencing>`.
.. note::
Changes made to reference numbers are logged in the chatter.
.. _accounting/invoice/resequencing:
Resequencing
------------
Changing the default sequence
-----------------------------
Resequencing is not possible:
To customize the default sequence, open the last confirmed invoice, click :guilabel:`Reset to
Draft`, and edit the invoice's reference number.
- When entries are before a lock date.
- When the sequence leads to a duplicate.
- When the :guilabel:`Invoice Date` doesn't match the date contained in the new sequence number,
e.g., if the sequence is changed to INV/2023/XXXXX for a document with an :guilabel:`Invoice Date`
of 2024.
.. image:: customer_invoices/reference-number.png
:alt: Editing the reference number of an invoice.
To change the invoice sequence with the structure INV/YYYY/MM/number, add `/MM` with the number of
the month of the :guilabel:`Invoice date`. Odoo will recognize the "/" term as a month and update
the future invoice sequence appropriately with the month of the :guilabel:`Invoice date`. For
example, if the invoice date is January, change the sequence to `INV/2024/01/XXXXX`.
Odoo then explains how the detected format will be applied to all future invoices. For example, if
the current invoice's month is added, the sequence's periodicity will change to every month instead
of every year.
In this case, if the :guilabel:`Invoice date` isn't aligned with the sequence number, a
:guilabel:`Validation Error` message appears.
.. image:: customer_invoices/sequence-dialog.png
:alt: Editing the reference number of an invoice.
.. note::
- All sequence changes are logged in the chatter to keep the information.
- Sequence changes also affect the format of future invoices' sequences.
.. _accounting/invoice/resequencing-one-invoice:
Resequencing a single invoice
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
To resequence the last confirmed invoice, click :guilabel:`Reset to Draft`, then change the
sequence. The invoice now appears in red on the :guilabel:`Customer Invoices` list.
.. tip::
The sequence format can be edited directly when creating the first invoice of a given sequence
period.
.. _accounting/invoice/mass-resequencing:
Mass-resequencing invoices
~~~~~~~~~~~~~~~~~~~~~~~~~~
--------------------------
It can be helpful to resequence multiple invoice numbers. For example, when importing invoices from
another invoicing or accounting system and the reference originates from the previous software,
@@ -239,6 +230,7 @@ Follow these steps to resequence invoice numbers:
- :guilabel:`Keep current order`: The order of the numbers remains the same.
- :guilabel:`Reorder by accounting date`: The number is reordered by accounting date.
#. Set the :guilabel:`First New Sequence`.
#. :guilabel:`Preview Modifications` and click :guilabel:`Confirm`.
@@ -270,18 +262,18 @@ go to :menuselection:`Accounting --> Reporting --> Partner Ledger`.
Aged Receivable
~~~~~~~~~~~~~~~
To review outstanding customer invoices and their related due dates, use the
:ref:`Aged Receivable <accounting/reporting/aged-receivable>` report. To access it, go to
:menuselection:`Accounting --> Reporting --> Aged Receivable`.
To review outstanding customer invoices and their related due dates, use the :ref:`Aged Receivable
<accounting/reporting/aged-receivable>` report. To access it, go to :menuselection:`Accounting -->
Reporting --> Aged Receivable`.
.. _accounting/invoices/aged-payable:
Aged Payable
~~~~~~~~~~~~
To review outstanding vendor bills and their related due dates, use the
:ref:`Aged Payable <accounting/reporting/aged-payable>` report. To access it, go to
:menuselection:`Accounting --> Reporting --> Aged Payable`.
To review outstanding vendor bills and their related due dates, use the :ref:`Aged Payable
<accounting/reporting/aged-payable>` report. To access it, go to :menuselection:`Accounting -->
Reporting --> Aged Payable`.
.. _accounting/invoices/profit-and-loss:
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

@@ -173,7 +173,8 @@ expression's **label** (ex. **code.label**).
`CUR` is the currency code in capital letters, and `amount` is the amount of the bound expressed in
that currency.
You can also use the `cross_report` subformula to match an expression found in another report.
`cross_report(xml_id | report_id)`
Used to match an expression from another report targeted by the xml_id or the report ID itself.
'Prefix of Account Codes' engine
--------------------------------
@@ -10,5 +10,6 @@ Manage deals
manage_deals/rfq
manage_deals/blanket_orders
manage_deals/calls_for_tenders
manage_deals/purchase_templates
manage_deals/control_bills
manage_deals/manage
@@ -0,0 +1,80 @@
==================
Purchase templates
==================
.. |Pts| replace:: Purchase templates
.. |pt| replace:: purchase template
.. |RFQ| replace:: :abbr:`RFQ (request for quotation)`
.. |RFQs| replace:: :abbr:`RFQs (requests for quotation)`
*Purchase templates* are an agreement type that allow for the repeated creation of requests for
quotations (RFQs) for recurring purchases. Products can then be added and quantities can be changed,
as needed. |Pts| can be used for multiple vendors, saving time and simplifying the |RFQ| process.
|Pts| differ from *blanket orders* in that a :doc:`blanket order <blanket_orders>` is a large order
split into several deliveries, therefore all |RFQs| must be for the same vendor. |PTs| can be
replicated for multiple vendors, and can copy over quantities, which is useful when placing frequent
orders.
Configuration
-------------
First, navigate to :menuselection:`Purchase app --> Configuration --> Settings`. Under the
:guilabel:`Orders` section, tick the :guilabel:`Purchase Agreements` checkbox. Click
:guilabel:`Save` to save the changes.
.. image:: purchase_templates/purchase-agreements-setting.png
:alt: The Purchase agreements setting in the Purchase app.
Create a new template
---------------------
Navigate :menuselection:`Purchase app --> Orders --> Purchase Agreements` and click :guilabel:`New`.
Select a :guilabel:`Vendor` from the drop-down list.
.. tip::
To make this template available to use with multiple vendors, leave the :guilabel:`Vendor` field
blank.
In the :guilabel:`Agreement Type` field, select :guilabel:`Purchase Template` from the drop-down.
Confirm the information in the remaining fields is correct, or update as needed.
On the :guilabel:`Products` tab, click :guilabel:`Add a line`, and select the desired product.
Update the :guilabel:`Quantity`, and set the :guilabel:`Unit Price`.
.. important::
When adding products to a new blanket order, the pre-existing prices of products are not
automatically added to the product lines. Instead, the prices **must** be manually assigned, by
changing the value in the :guilabel:`Unit Price` column to an agreed-upon price with the listed
vendor. Otherwise, the price will remain `0`.
After adding all necessary products, click :guilabel:`Confirm`.
Create a new RFQ from a purchase template
=========================================
After confirming a |pt|, new quotations can be created directly from the |pt| form. |RFQs| using
this form are pre-populated with information based on the rules set in the form. Additionally, new
quotations are automatically linked to this |pt| form, via the :icon:`fa-list-alt`
:guilabel:`RFQs/Orders` smart button at the top of the form.
To :ref:`create a new quotation <purchase/manage_deals/create-new-rfq>`, click :guilabel:`New
Quotation`. This opens a new |RFQ|, that is pre-populated with the correct information, depending on
the settings configured on the |pt| form.
If there was no vendor identified on the |pt|, choose a :guilabel:`Vendor` from the drop-down list.
Products can be added to the |RFQ| by clicking :guilabel:`Add a product` in the :guilabel:`Products`
tab. To remove a product, click the :icon:`fa-trash-o` :guilabel:`(trash)` icon at the far-right of
the product line.
From the new |RFQ| form, click :guilabel:`Send by Email` to compose and send an email to the listed
vendor. Click :guilabel:`Print RFQ` to generate a printable PDF of the quotation; or, once ready,
click :guilabel:`Confirm Order` to confirm the purchase order.
After confirming the order, return to the |pt| via the breadcrumbs. The :icon:`fa-list-alt`
:guilabel:`RFQs/Orders` smart button has been updated to list the confirmed order.
.. image:: purchase_templates/rfq-smart-button.png
:alt: The RFQ smart button on a purchase template.
Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

@@ -91,6 +91,8 @@ In addition to various view options, the :guilabel:`Requests for Quotation` dash
.. seealso::
:doc:`../../../essentials/search`
.. _purchase/manage_deals/create-new-rfq:
Create new |RFQ|
----------------
+1
View File
@@ -21,3 +21,4 @@ deliver and invoice what has been sold.
sales/products_prices
sales/amazon_connector
sales/shopee_connector
sales/gelato
+160 -3
View File
@@ -1,7 +1,164 @@
:orphan:
======
Gelato
======
The documentation for Gelato will be added soon.
Gelato is a global print-on-demand platform that integrates with Odoo to sync product catalogs and
automate order fulfillment.
Connecting Gelato's services with Odoo's **Sales** and **eCommerce** apps enables the following:
- Sync Odoo sales orders with Gelato for automated order fulfillment
- Create and manage Gelato products within Odoo; supports product variant and image sync
- Configure delivery options in Odoo and receive order updates via webhooks.
Configuration
=============
.. important::
The company information (*Company name* and *Billing address*) in the Gelato account *must* match
the company information in the Odoo database in order for sales orders to be confirmed and sent
to Gelato for fulfillment.
.. image:: gelato/gelato-company.png
:alt: Company information in Gelato.
.. image:: gelato/odoo-company.png
:alt: Company information in Odoo.
Configure API keys and webhooks in Gelato
-----------------------------------------
Before configuring the Gelato connector in Odoo, first obtain API credentials and webhooks from the
Gelato account.
API connectors enable Odoo **Sales** to send and receive data from Gelato for order processing,
while webhooks provide real-time updates on order status and shipment tracking.
API Key
~~~~~~~
An API Key is a unique authentication token that allows Odoo to securely communicate with Gelato's
API, enabling order transmission, status updates, and data synchronization.
After logging into Gelato, click :icon:`fa-code` :guilabel:`Developer` in the left menu bar. From
here, click on :guilabel:`API keys`. In the new page, click the :guilabel:`Add API Key` button to
open a new API key form. Type in a name, then click :guilabel:`Create Key`.
Copy the generated API key using :guilabel:`Copy to Clipboard`.
.. image:: gelato/gelato-api-key.png
:alt: Newly generated API key in the Gelato platform.
.. important::
Copy the API key and store it somewhere safe and secure before leaving this page. Once the page
is refreshed or exited, the key will not be available to copy.
If the key cannot be copied or is lost, return to the :guilabel:`API key` page and start over,
creating a new API key.
Webhook
~~~~~~~
A webhook is an automated notification system that instantly updates Odoo when Gelato processes,
ships, or delivers an order, ensuring real-time tracking and minimal manual intervention.
To create a webhook, go to :menuselection:`Developer --> Webhooks` under the :guilabel:`Developer`
drop-down menu in the left menu bar. In the new page, click :guilabel:`Add Webhook` to open a
:guilabel:`Create Webhook` form.
The webhook form requires several specific configurations:
- :guilabel:`URL`: This tells Gelato where to send the order updates in Odoo. Copy and paste the
Odoo database URL with the additional suffix `/gelato/webhook`.
.. example::
`https://stealthywood.odoo.com/gelato/webhook`
- :guilabel:`Events`: Click into the field and select :guilabel:`order_status_updated`. Selecting
:guilabel:`order_status_updated` ensures Odoo receives order changes automatically.
- :guilabel:`Method`: Click into the field and select the :guilabel:`HTTP Post` option, as this is
the request method used to send data from Gelato to Odoo.
- Tick the checkbox next to :guilabel:`I want to take Authorization to this webhook`.
- :guilabel:`Header Name`: In this field, type in `signature` to match the field in Odoo.
- Click :guilabel:`Generate Key` to generate a :guilabel:`Header Value`.
- Click :guilabel:`Create` to complete this webhook configuration.
.. image:: gelato/gelato-webhook.png
:alt: Newly configured webhook in the Gelato platform.
.. tip::
Copy and paste the API key and webhook on a notepad before tabbing out of the Gelato webpage as
backup.
Configure Gelato connector in Odoo
----------------------------------
In Odoo, navigate to :menuselection:`Sales app --> Configuration --> Settings`, then scroll to the
:guilabel:`Connectors` section. Enable the :guilabel:`Gelato` connector by ticking the checkbox.
Next, paste the newly generated API keys and webhook secret key into their respective fields. Once
saved, Gelato is available in Odoo **Sales** and **eCommerce** products.
Synchronizing Gelato products with Odoo Sales
=============================================
It is recommended to have products already configured in Gelato before configuring them in Odoo. To
get the product ID in Gelato, navigate to the :guilabel:`Templates` page from the side bar menu.
Select which product to synchronize in Odoo, then hover over the product card to reveal the
:icon:`fa-ellipsis-v` :guilabel:`(vertical ellipsis)` menu icon. Click the menu icon, then click
:guilabel:`Copy Template ID` to copy the product template ID to the clipboard.
.. seealso::
`Start selling products with Gelato: Quick & easy setup
<https://www.gelato.com/blog/get-started-with-gelato-creating-products>`_
Odoo Sales product
------------------
To create a product in Odoo that matches the Gelato product, navigate to :menuselection:`Sales app
--> Products --> Products`, select :guilabel:`New` to create a new product form. Type in the product
:guilabel:`Name`, then navigate to the :guilabel:`Sales` tab. Find the :guilabel:`Gelato` section,
then click into the :guilabel:`Template Reference` field and paste the copied template ID from the
Gelato product. Finally, click :guilabel:`Synchronize`.
Successful synchronization pulls the Gelato product variant options into the newly configured Odoo
product.
In the new :guilabel:`Print Images` field, click the :guilabel:`default` marker to set a default
product image. Click the :icon:`fa-pencil` :guilabel:`(edit)` icon and select the product image file
to upload, then :guilabel:`Save & Close`.
.. important::
The :guilabel:`Print Images` field *must* be configured on all Gelato products and their
respective product variations before they can be ordered.
Product variants
----------------
To view and edit the newly synchronized product variants, navigate to the :guilabel:`Attributes &
Variants` tab, which will have the variants pulled from the Gelato product configuration. Click the
:guilabel:`Configure` button to edit and configure the variant images, delivery methods, additional
pricing, etc.
Order a Gelato product from Odoo
--------------------------------
Once synchronized, Gelato products are available to order in Odoo through :doc:`sales quotations
<send_quotations>` or on the **eCommerce** store. Gelato delivery options are automatically
synchronized upon API and webhook configuration.
To add Gelato delivery, click :guilabel:`Add shipping` on the sales order. Select
:guilabel:`Standard Delivery` or :guilabel:`Express Delivery` in the :guilabel:`Shipping Method`
field, then click :guilabel:`Get rate`.
Once the quotation is confirmed, it becomes an active sales order, and the order is sent to Gelato
for fulfillment. Once a sales order is sent from Odoo to Gelato, Gelato processes the order,
produces the product at the nearest fulfillment center, and ships it directly to the end-customer.
.. seealso::
:doc:`send_quotations/create_quotations`
.. important::
When creating a sales order for Gelato products in the database, only Gelato products can be
added to the same sales order. Multivendor orders are not available with the Gelato connector at
this time.
Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

@@ -766,11 +766,11 @@ widgets, respectively).
<field name="arch" type="xml">
<form string="Business Trip">
<!-- Your usual form view goes here -->
<div class="oe_chatter">
<chatter>
<field name="message_follower_ids" widget="mail_followers"/>
<field name="activity_ids" widget="mail_activity"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</chatter>
</form>
</field>
</record>
@@ -2261,6 +2261,16 @@ attributes:
:default: `True`
:scope: :class:`~odoo.fields.Many2one` fields
.. attribute:: depth
:noindex:
If set to a non zero integer, the hierarchy (if any) will be unfold up to the given level.
:requirement: Optional
:type: integer
:default: `0`
:scope: :class:`~odoo.fields.Many2one` fields
When the `field` element has the `select=multi` attribute set, it can have the following additional
attributes: