Compare commits

..

1 Commits

Author SHA1 Message Date
oco-odoo
d39b6a3562 [IMP] Accounting: Reports: Document the new cross_report syntax for forced date scope
task-5243334
2025-12-01 14:09:40 +01:00
54 changed files with 648 additions and 712 deletions

View File

@@ -2,6 +2,9 @@
Export and import data
======================
.. |list| replace:: :icon:`oi-view-list` :guilabel:`(list)` icon
.. |actions| replace:: :icon:`fa-cog` :guilabel:`Actions`
In Odoo, it is sometimes necessary to export or import data for running reports, or for data
modification. This document covers the export and import of data into and out of Odoo.
@@ -16,20 +19,19 @@ Export data from Odoo
=====================
When working with a database, it is sometimes necessary to export data in a distinct file. Doing so
can aid in reporting on activities, although, Odoo provides a precise reporting tool with each
available application.
can aid in reporting on activities, although, Odoo provides a precise and easy reporting tool with
each available application.
With Odoo, the values can be exported from any field in any record. To do so, activate the list view
:icon:`fa-list` :guilabel:`(List)` icon, on the items that need to be exported, and then select the
records that should be exported. To select a record, tick the checkbox next to the corresponding
record. Finally, click the :guilabel:`Action` button, and select :icon:`fa-upload`
:guilabel:`Export`.
(|list|), on the items that need to be exported, then select the records that should be exported. To
select a record, tick the checkbox next to the corresponding record. Finally, click on |actions|,
then :guilabel:`Export`.
.. image:: export_import_data/list-view-export.png
:alt: View of the different things to enable/click to export data.
When clicking on :icon:`fa-upload` :guilabel:`Export`, a :guilabel:`Export Data` pop-over window
appears, with several options for the data to export:
When clicking on :guilabel:`Export`, an :guilabel:`Export Data` pop-over window appears, with
several options for the data to export:
.. image:: export_import_data/export-data-overview.png
:alt: Overview of options to consider when exporting data in Odoo.
@@ -37,27 +39,27 @@ appears, with several options for the data to export:
#. With the :guilabel:`I want to update data (import-compatable export)` option ticked, the system
only shows the fields that can be imported. This is helpful in the case where the :ref:`existing
records need to be updated <essentials/update-data>`. This works like a filter. Leaving the box
unticked, gives many more field options because it shows all the fields, not only the ones that
unticked, gives many more field options because it shows all the fields, not just the ones that
can be imported.
#. When exporting, there is the option to export in two formats: `.csv` and `.xls`. With `.csv`,
items are separated by a comma, while `.xls` holds information about all the worksheets in a
file, including both content and formatting.
#. These are the items that can be exported. Use the :icon:`fa-chevron-right` :guilabel:`(Show
sub-fields)` icon to display more sub-field options. Use the :guilabel:`Search` bar to find
specific fields. To use the :guilabel:`Search` option more efficiently, click on all the
:icon:`fa-chevron-right` :guilabel:`(Show sub-fields)` icon to display all fields.
#. The :icon:`fa-plus` :guilabel:`(Select field)` icon button is present to add fields to the
:guilabel:`Fields to export` list.
#. The :icon:`fa-sort` :guilabel:`(Sort)` icon to the left of the selected fields can be used to
move the fields up and down, to change the order in which they are displayed in the exported
file. Drag-and-drop using the :icon:`fa-sort` :guilabel:`(Sort)` icon.
#. The :icon:`fa-trash` :guilabel:`(Remove field)` icon is used to remove fields. Click the
:icon:`fa-trash` :guilabel:`(Remove field)` icon to remove the field.
#. These are the items that can be exported. Use the :guilabel:`> (right arrow)` icon to display
more sub-field options. Use the :guilabel:`Search` bar to find specific fields. To use the
:guilabel:`Search` option more efficiently, click on all the :guilabel:`> (right arrows)` to
display all fields.
#. The :guilabel:`+ (plus sign)` icon button is present to add fields to the :guilabel:`Fields to
export` list.
#. The :guilabel:`↕️ (up-down arrow)` to the left of the selected fields can be used to move the
fields up and down, to change the order in which they are displayed in the exported file.
Drag-and-drop using the :guilabel:`↕️ (up-down arrow)` icon.
#. The :guilabel:`🗑️ (trash can)` icon is used to remove fields. Click on the :guilabel:`🗑️ (trash
can)` icon to remove the field.
#. For recurring reports, it is helpful to save export presets. Select all the needed fields, and
click on the template drop-down menu. Once there, click on :guilabel:`New template`, and give a
unique name to the export template. Click the :icon:`fa-floppy-o` :guilabel:`(floppy drive)` icon
to save the configuration. The next time the same list needs to be exported, select the related
template that was previously saved from the drop-down menu.
unique name to the export just created. Click the :guilabel:`💾 (floppy drive)` icon to save the
configuration. The next time the same list needs to be exported, select the related template that
was previously saved from the drop-down menu.
.. tip::
It is helpful to know the field's external identifier. For example, :guilabel:`Related Company`
@@ -100,19 +102,18 @@ Data can be imported on any Odoo business object using either Excel (`.xlsx`) or
(Comma-separated Values)` (`.csv`) formats. This includes: contacts, products, bank statements,
journal entries, and orders.
Open the view of the object to which the data should be imported/populated, click on :icon:`fa-cog`
:guilabel:`(Action)` icon, and in the drop-down menu select :icon:`fa-upload` :guilabel:`(Import
records)`.
Open the view of the object to which the data should be imported/populated, click the :icon:`fa-cog`
(:guilabel:`gear`) icon and select :guilabel:`Import records`.
.. image:: export_import_data/import-button.png
:alt: Action menu revealed with the import records option highlighted.
Click :icon:`fa-upload`:guilabel:`Import Template for Customers` at the center of the page to
download a :ref:`template <essentials/export_import_data/adapt-a-template>` and populate it with the
company's own data. Such templates can be imported in one click since the data mapping is already
preconfigured.
Click :icon:`fa-download`:guilabel:`Import Template for Customers` at the center of the page to
download a :ref:`template <essentials/export_import_data/adapt-a-template>` and populate it with
the company's own data. Such templates can be imported in one click since the data mapping is
already preconfigured.
To upload the downloaded template or an existing file, follow the next steps:
To upload the downloaded template or your own file, follow the next steps:
#. Click :guilabel:`Upload Data File` and select the desired file.
#. Adjust the :guilabel:`Formatting` options as needed (for CSV files only).
@@ -151,15 +152,15 @@ Once the template is downloaded, proceed to follow these steps:
fit any field within Odoo. However, new columns can be mapped manually when the import is tested.
Search the drop-down menu for the corresponding field.
.. image:: export_import_data/field-list.png
.. image:: export_import_data/field_list.png
:alt: Drop-down menu expanded in the initial import screen on Odoo.
Then, use this field's label in the import file to ensure future imports are successful.
.. tip::
Another useful way to find out the proper column names to import is to export a sample file using
the fields to be imported. This way, if there is not a sample import template, the names are
accurate.
Another useful way to find out the proper column names to import is to export a sample file
using the fields that should be imported. This way, if there is not a sample import template,
the names are accurate.
.. _essentials/external-id:
@@ -167,8 +168,8 @@ Once the template is downloaded, proceed to follow these steps:
Import from another application
-------------------------------
The :guilabel:`External ID` (ID) is a unique identifier for a line item. It is possible to use an
:guilabel:`External ID` (ID) from previous software to facilitate the transition to Odoo.
The :guilabel:`External ID` (ID) is a unique identifier for the line item. Feel free to use one
from previous software to facilitate the transition to Odoo.
Setting an ID is not mandatory when importing, but it helps in many cases:
@@ -200,7 +201,7 @@ the column may be mapped to a field that is not proposed by default.
If this happens, check the :guilabel:`Show fields of relation fields (advanced) option`, then a
complete list of fields becomes available for each column.
.. image:: export_import_data/field-list.png
.. image:: export_import_data/field_list.png
:alt: Searching for the field to match the tax column.
Change data import format
@@ -223,7 +224,7 @@ the preferred format using *ISO 8601* to define the format.
.. important::
*ISO 8601* is an international standard, covering the worldwide exchange, along with the
communication of date and time-related data. For example, the date format should be `YYYY-MM-DD`.
In the case of July 24th 1981, it should be written as `1981-07-24`.
So, in the case of July 24th 1981, it should be written as `1981-07-24`.
.. tip::
When importing Excel files (`.xls`, `.xlsx`), consider using *date cells* to store dates. This
@@ -370,7 +371,7 @@ The tags should be separated by a comma, without any spacing. For example, if a
linked to both tags: `Manufacturer` and `Retailer` then 'Manufacturer,Retailer' needs to be encoded
in the same column of the :abbr:`CSV (Comma-separated Values)` file.
- :download:`CSV file for Manufacturer, Retailer <export_import_data/m2m-customers-tags.csv>`
- :download:`CSV file for Manufacturer, Retailer <export_import_data/m2m_customers_tags.csv>`
Import one2many relationships
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -380,34 +381,33 @@ reserved in the :abbr:`CSV (Comma-separated Values)` file for each order line. T
is imported on the same row as the information relative to order. Any additional lines need an
additional row that does not have any information in the fields relative to the order.
.. example::
A company imports quotations using a :abbr:`CSV (Comma-separated Values)` file, based on demo
data:
As an example, here is a :abbr:`CSV (Comma-separated Values)` file of some quotations that can be
imported, based on demo data:
- :download:`File for some quotations <export_import_data/o2m-quotations-order-lines.csv>`
- :download:`File for some Quotations
<export_import_data/purchase.order_functional_error_line_cant_adpat.csv>`
A company imports purchase orders with their respective purchase order lines using a :abbr:`CSV
(Comma-separated Values)` file:
The following :abbr:`CSV (Comma-separated Values)` file shows how to import purchase orders with
their respective purchase order lines:
- :download:`Purchase orders with their respective purchase order lines
<export_import_data/o2m-purchase-order-lines.csv>`
- :download:`Purchase orders with their respective purchase order lines
<export_import_data/o2m_purchase_order_lines.csv>`
A company imports customers and their respective contacts using a :abbr:`CSV (Comma-separated
Values)` file:
- :download:`Customers and their respective contacts
<export_import_data/o2m-customers-contacts.csv>`
The following :abbr:`CSV (Comma-separated Values)` file shows how to import customers and their
respective contacts:
- :download:`Customers and their respective contacts
<export_import_data/o2m_customers_contacts.csv>`
Import image files
------------------
To import image files along with the :ref:`uploaded <essentials/export_import_data/get-started>` CSV
or Excel file, follow the next steps:
To import image files along with the :ref:`uploaded <essentials/export_import_data/get-started>`
CSV or Excel file, follow the next steps:
#. Add the image file names to the relevant :guilabel:`Image` column in the data file.
#. :ref:`Upload the data file <essentials/export_import_data/get-started>` or reload it by clicking
:guilabel:`Load Data File`.
#. :ref:`Upload the data file <essentials/export_import_data/get-started>` or reload it by
clicking :guilabel:`Load Data File`.
#. Click :guilabel:`Upload your files` under the :guilabel:`Files to import` section.
#. Select the relevant image files. The number of files selected appears next to the button.
#. Click :guilabel:`Test` to verify that all data is valid.
@@ -416,16 +416,15 @@ or Excel file, follow the next steps:
imported without any image.
.. note::
- The :guilabel:`Files to import` section is enabled if the product template has an
- The :guilabel:`Files to import` section is enabled if your product template has an
:guilabel:`Image` column with all fields populated.
- The image file names in the data file must correspond to the uploaded image files.
- When importing a large number of images, specify the maximum batch size in megabytes and set a
delay to prevent the system from becoming overloaded. To do so, :doc:`enable the developer mode
<../general/developer_mode>` and fill in the :guilabel:`Max size per batch` and the
:guilabel:`Delay after each batch` fields in the :guilabel:`Files to import` section. By
default, the delay meets the RPC/API call limit defined in the `Odoo Cloud - Acceptable Use
Policy <https://www.odoo.com/acceptable-use>`_.
- When importing a large number of images, you can specify the maximum batch size in megabytes
and set a delay to prevent the system from becoming overloaded. To do so, :doc:`enable the
developer mode <../general/developer_mode>` and fill in the :guilabel:`Max size per
batch` and the :guilabel:`Delay after each batch` fields in the :guilabel:`Files to import`
section. By default, the delay meets the RPC/API call limit defined in the `Odoo Cloud -
Acceptable Use Policy <https://www.odoo.com/acceptable-use>`_.
Import records several times
----------------------------
@@ -444,8 +443,8 @@ Value not provided for a specific field
---------------------------------------
If all fields are not set in the CSV file, Odoo assigns the default value for every non-defined
field. However, if fields are set with empty values in the :abbr:`CSV (Comma-separated Values)`
file, Odoo sets the empty value in the field, instead of assigning the default value.
field. But, if fields are set with empty values in the :abbr:`CSV (Comma-separated Values)` file,
Odoo sets the empty value in the field, instead of assigning the default value.
Export/import different tables from an SQL application to Odoo
--------------------------------------------------------------
@@ -506,8 +505,8 @@ the original database).
The two files produced are ready to be imported in Odoo without any modifications. After having
imported these two :abbr:`CSV (Comma-separated Values)` files, there are four contacts and three
companies (the first two contacts are linked to the first company). Keep in mind to first import the
companies, and then the people.
companies (the first two contacts are linked to the first company). Keep in mind to first import
the companies, and then the people.
.. _essentials/update-data:
@@ -520,10 +519,10 @@ Existing data can be updated in bulk through a data import, as long as the :ref:
Prepare data export
-------------------
To update data through an import, first navigate to the data to be updated, and select the
:icon:`oi-view-list` :guilabel:`(List)` icon to activate list view. On the far-left side of the
list, tick the checkbox for any record to be updated. Then, click :guilabel:`Actions` button, and
select :icon:`fa-upload` :guilabel:`Export` from the drop-down menu.
To update data through an import, first navigate to the data to be updated, and select the |list| to
activate list view. On the far-left side of the list, tick the checkbox for any record to be
updated. Then, click |actions|, and select :icon:`fa-upload` :guilabel:`Export` from the drop-down
menu.
On the resulting :guilabel:`Export Data` pop-up window, tick the checkbox labeled, :guilabel:`I want
to update data (import-compatible export)`. This automatically includes the *External ID* in the

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@@ -1,6 +0,0 @@
Activities,Company,Customer,Order Date,Order Reference,Pricelist,Order Lines/Product Template,Order Lines/Quantity,Order Lines/Unit Price,Order Lines/Discount (%),Order Lines/Taxes
Answer questions,My Company (San Francisco),Ready Mat,2025-12-01 10:37:22,S00003,Public Pricelist (USD),Virtual Interior Design,10,30.75,0,Tax 10%
,,,,,,[FURN_7777] Office Chair,1,70,0,Tax 10%
,,,,,,Deposit,5,150,0,
,My Company (San Francisco),Ready Mat,2025-11-01 11:37:00,S00002,Public Pricelist (USD),Virtual Interior Design,24,75,0,Tax 10%
,,,,,,Virtual Home Staging,30,38.25,0,Tax 10%
1 Activities Company Customer Order Date Order Reference Pricelist Order Lines/Product Template Order Lines/Quantity Order Lines/Unit Price Order Lines/Discount (%) Order Lines/Taxes
2 Answer questions My Company (San Francisco) Ready Mat 2025-12-01 10:37:22 S00003 Public Pricelist (USD) Virtual Interior Design 10 30.75 0 Tax 10%
3 [FURN_7777] Office Chair 1 70 0 Tax 10%
4 Deposit 5 150 0
5 My Company (San Francisco) Ready Mat 2025-11-01 11:37:00 S00002 Public Pricelist (USD) Virtual Interior Design 24 75 0 Tax 10%
6 Virtual Home Staging 30 38.25 0 Tax 10%

View File

@@ -0,0 +1,6 @@
"Order Reference","Supplier","Destination","Pricelist","Order Lines / Product","Order Lines / Quantity"
"PO000020","ASUSTeK","Stock","Default Purchase Pricelist","ADPT",20
,,,,"CARD",30
,,,,"C-Case",40
"PO000021","Axelor","Stock","Default Purchase Pricelist","CD",5
,,,,"CPUa8",15
1 Order Reference Supplier Destination Pricelist Order Lines / Product Order Lines / Quantity
2 PO000020 ASUSTeK Stock Default Purchase Pricelist ADPT 20
3 CARD 30
4 C-Case 40
5 PO000021 Axelor Stock Default Purchase Pricelist CD 5
6 CPUa8 15

View File

@@ -5,85 +5,159 @@ Adyen
`Adyen <https://www.adyen.com/>`_ is a Dutch company that offers several online payment
possibilities.
.. note::
Adyen only works with customers processing **more than 10 million annually** or invoicing a
**minimum of 1000 transactions per month**.
.. _payment_providers/adyen/configure_dashboard:
Adyen configuration
===================
#. Create an Adyen account if necessary and log into your Adyen Customer Area.
.. tip::
Log into your **Test account** to try the integration without charging customers.
Switch to your **Live account** once you are ready to accept payments.
#. `Contact the Adyen support team <https://docs.adyen.com/platforms/quickstart-guide/support#contact-adyen-support>`_
to enable the **Multiple partial capture** feature.
#. In the Adyen Customer Area, go to :menuselection:`Developers --> API credentials` and click the
relevant API credential user name in the list or click :guilabel:`Create new credential` to
create a new one.
#. In the :guilabel:`Server settings` section, click :guilabel:`Generate API key`, then click the
:icon:`fa-copy` (:guilabel:`Copy API key`) icon and save the value for the
:ref:`payment_providers/adyen/configure_odoo` step.
#. In the :guilabel:`Client settings` section, click :guilabel:`Generate client key`, then
click the :icon:`fa-copy` (:guilabel:`Copy API key`) icon and save the value for
the :ref:`payment_providers/adyen/configure_odoo` step.
#. Enter your Odoo website URL in the :guilabel:`Add allowed origins` field, then click
:guilabel:`Add`.
#. Click :guilabel:`Save changes` at the bottom of the page.
#. Go to :menuselection:`Developers --> Webhooks` in the left menu and click :guilabel:`Create new
webhook`.
#. In the :guilabel:`Create new webhook` popup, click :guilabel:`Add` on to the :guilabel:`Standard
webhook` line.
#. On the :guilabel:`Webhook generation` form, in the :guilabel:`Server configuration` section,
enter your Odoo database :guilabel:`URL` followed by `/payment/adyen/notification`.
#. In the :guilabel:`Security` section, click :guilabel:`Generate` under :guilabel:`HMAC`, then
click the :icon:`fa-copy` (:guilabel:`Copy HMAC to the clipboard`) icon and save the value for
the :ref:`payment_providers/adyen/configure_odoo` step.
#. Click :guilabel:`Save configuration` at the bottom of the page.
#. Go to :menuselection:`Developers --> API URLs`, then copy the :guilabel:`Prefix` and save it for
the :ref:`payment_providers/adyen/configure_odoo` step.
.. _payment_providers/adyen/configure_odoo:
Odoo configuration
==================
#. :ref:`Navigate to the Adyen payment provider<payment_providers/add_new>`.
#. Fill in the :guilabel:`Merchant account`, :guilabel:`API Key`, :guilabel:`Client Key`,
:guilabel:`HMAC Key`, and :guilabel:`API URL Prefix` fields with the values saved at the
:ref:`Adyen configuration step <payment_providers/adyen/configure_dashboard>`.
#. Configure the remaining options as needed.
#. Set the :guilabel:`State` field to :guilabel:`Enabled`.
.. tip::
If you want to :ref:`test Adyen without affecting live transactions
<payment_providers/test-mode>`, use your **Test account** credentials, enter
`https://checkout-test.adyen.com` in the :guilabel:`API URL Prefix` field, and set the
:guilabel:`State` field to :guilabel:`Test Mode`.
Manual capture
==============
To enable :ref:`manual capture <payment_providers/manual_capture>` for Adyen payments, follow
these steps:
#. :ref:`Navigate to the Adyen payment provider <payment_providers/add_new>`.
#. Go to the :guilabel:`Configuration` tab and enable :guilabel:`Capture Amount Manually`.
#. Log in to your Adyen Customer Area, then go to :menuselection:`Settings` and click
:guilabel:`Company` in the :guilabel:`Account management` section.
#. In the :guilabel:`General` section, click the :icon:`fa-pencil` (:guilabel:`Edit property`)
icon next to the :guilabel:`Capture Delay` field.
#. In the popup, set the :guilabel:`Capture delay` field to :guilabel:`Manual` and click
:guilabel:`Save`.
.. seealso::
- :ref:`payment_providers/add_new`
- :doc:`../payment_providers`
.. note::
- If the transaction is not captured within 7 days, the customer is entitled to revoke it.
- You can :ref:`manually capture <payment_providers/manual_capture>` and :ref:`refund
<payment_providers/refunds>` payments directly from your Adyen Customer Area.
Adyen works only with customers processing **more** than **10 million annually** or invoicing a
**minimum** of **1.000** transactions **per month**.
Configuration
=============
.. seealso::
:ref:`payment_providers/add_new`
First, reach Adyen support to enable :guilabel:`multiple partial capture` for you.
Credentials tab
---------------
Odoo needs your **API Credentials** to connect with your Adyen account, which comprise:
- **Merchant Account**: The code of the merchant account to use with Adyen.
- :ref:`API Key <adyen/api_and_client_keys>`: The API key of the webservice user.
- :ref:`Client Key <adyen/api_and_client_keys>`: The client key of the webservice user.
- :ref:`HMAC Key <adyen/hmac_key>`: The HMAC key of the webhook.
- :ref:`Checkout API URL <adyen/urls>`: The base URL for the Checkout API endpoints.
- :ref:`Recurring API URL <adyen/urls>`: The base URL for the Recurring API endpoints.
You can copy your credentials from your Adyen account, and paste them in the related fields under
the **Credentials** tab.
.. important::
If you are trying Adyen as a test, with an Adyen *test account*, head to
:menuselection:`Accounting --> Configuration --> Payment Providers`. There, click on
:guilabel:`Adyen`, enable :guilabel:`Test Mode` and enter your credentials in the
:guilabel:`Credentials` tab.
.. _adyen/api_and_client_keys:
API Key and Client Key
~~~~~~~~~~~~~~~~~~~~~~
In order to retrieve the API Key and the Client Key, log into your Adyen account, go to
:menuselection:`Developers --> API Credentials`.
- If you already have an API user, open it.
- If you don't have an API user yet, click on **Create new credential**.
Go to :menuselection:`Server settings --> Authentification` and copy or generate your **API Key**.
Be careful to copy your API key as you'll not be allowed to get it later without generating a new
one.
Now, head to :menuselection:`Client settings --> Authentification` and cody or generate your
**Client Key**. This is also the place where you can :ref:`allow payments to be made from your
website <adyen/allowed_origins>`.
.. _adyen/hmac_key:
HMAC key
~~~~~~~~
In order to retrieve the HMAC Key, you'll need to configure a `Standard Notification` webhook. For
this, log into your Adyen account then go to :menuselection:`Developers --> Webhooks --> Add webhook
--> Add Standard notification`.
.. image:: adyen/adyen-add-webhook.png
:align: center
:alt: Configure a webhook.
There, in :menuselection:`General --> Server configuration --> URL`, enter your server address
followed by `/payment/adyen/notification`.
.. image:: adyen/adyen-webhook-url.png
:align: center
:alt: Enter the notification URL.
Then enter :menuselection:`Security --> HMAC Key --> Generate`. Be careful to copy the key as you
will not be allowed to do it later without generating a new one.
.. image:: adyen/adyen-hmac-key.png
:align: center
:alt: Generate a HMAC key and save it.
You have to save the webhook to finalize its creation.
.. _adyen/urls:
API URLs
~~~~~~~~
All Adyen API URLs include a customer area-specific prefix generated by Adyen. To configure the
URLs, proceed as follows:
#. Log into your Adyen account, then go to :menuselection:`Developers --> API URLs`.
#. Copy the :guilabel:`Prefix` for your live Customer area (i.e., **data center**) and save it for
later.
.. image:: adyen/adyen-api-urls.png
:alt: Copy the prefix for the Adyen APIs
#. In Odoo, :ref:`navigate to the payment provider Adyen <payment_providers/add_new>`.
#. In the :guilabel:`Checkout API URL` field, enter the following URL and replace `yourprefix` with
the prefix you previously saved:
`https://yourprefix-checkout-live.adyenpayments.com/checkout`
#. In the :guilabel:`Recurring API URL` field, enter the following URL and replace `yourprefix` with
the prefix you previously saved:
`https://yourprefix-pal-live.adyenpayments.com/pal/servlet/Recurring`.
.. note::
If you are trying Adyen as a test, you can use the following URLs instead:
- :guilabel:`Checkout API URL`: `https://checkout-test.adyen.com`
- :guilabel:`Recurring API URL`: `https://pal-test.adyen.com/pal/servlet/Recurring`
Adyen Account
-------------
.. _adyen/allowed_origins:
Allow payments from a specific origin
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
To allow payment originated from your website, follow the steps in :ref:`adyen/api_and_client_keys`
to navigate to your API user and go to :menuselection:`Add allowed origins`, then add the URLs from
where payments will be made (the URLs of the servers hosting your Odoo instances).
.. image:: adyen/adyen-allowed-origins.png
:align: center
:alt: Allows payments originated from a specific domain.
Place a hold on a card
----------------------
Adyen allows you to capture an amount manually instead of having an immediate capture.
To set it up, enable the **Capture Amount Manually** option on Odoo, as explained in the
:ref:`payment providers documentation <payment_providers/manual_capture>`.
Then, open your Adyen Merchant Account, go to :menuselection:`Account --> Settings`, and set the
**Capture Delay** to **manual**.
.. image:: adyen/adyen_capture_delay.png
:align: center
:alt: Capture Delay settings in Adyen
.. caution::
- If you configure Odoo to capture amounts manually, make sure to set the **Capture Delay** to
**manual** on Adyen. Otherwise, the transaction will be blocked in the authorized state in
Odoo.
.. note::
- After **7 days**, if the transaction has not been captured yet, the customer has the right to
**revoke** it.
.. seealso::
:doc:`../payment_providers`

View File

@@ -4,31 +4,28 @@ Iyzico
`Iyzico <https://www.iyzico.com/>`_ is an online payment provider covering Turkey.
.. _payment_providers/iyzico/configure-dashboard:
.. _payment_providers/iyzico/configure_dashboard:
Configuration on the Iyzico Dashboard
=====================================
#. Log into the `Iyzico Dashboard <https://merchant.iyzipay.com>`_.
#. Navigate to :menuselection:`Settings --> Merchant Settings`.
#. Copy the values of the :guilabel:`API Key` and :guilabel:`Secret Key` fields and save them for
the :ref:`payment_providers/iyzico/configure-odoo` step.
#. On the same :guilabel:`Merchant Settings` page, enable :guilabel:`Merchant Notifications`.
#. Navigate to :menuselection:`Settings --> Merchant Settings` and copy the values of the
:guilabel:`API Key` and :guilabel:`Secret Key` fields and save them for later.
#. In the same Merchant Settings page, Find and enable :guilabel:`Merchant Notifications` section.
#. | Enter your Odoo database URL followed by `/payment/iyzico/webhook` in the
:guilabel:`Merchant Notification Url` field.
| For example: `https://example.odoo.com/payment/iyzico/webhook`.
#. Click :guilabel:`Save`.
.. _payment_providers/iyzico/configure-odoo:
Configuration on Odoo
=====================
Odoo configuration
==================
#. :ref:`Navigate to the payment provider Iyzico <payment_providers/add_new>`.
#. In the :guilabel:`Credentials` tab, fill the :guilabel:`API Key` and :guilabel:`Secret Key`
fields with the values you saved at the step :ref:`payment_providers/iyzico/configure-dashboard`.
#. Configure the remaining options as needed.
#. Set the :guilabel:`State` field to :guilabel:`Enabled`.
#. :ref:`Navigate to the payment provider Iyzico <payment_providers/add_new>` and change its
state to :guilabel:`Enabled`.
#. In the :guilabel:`Credentials` tab, fill the :guilabel:`API Key`, and :guilabel:`Secret Key`, with
the values you saved at the step :ref:`payment_providers/iyzico/configure_dashboard`.
#. Configure the rest of the options to your liking.
.. seealso::
:doc:`../payment_providers`

View File

@@ -4,30 +4,28 @@ Mollie
`Mollie <https://www.mollie.com/>`_ is an online payments platform established in the Netherlands.
.. _payment_providers/mollie/configure_dashboard:
Mollie configuration
====================
#. `Create a Mollie account
<https://my.mollie.com/dashboard/signup>`_ if necessary
and log in to the `Mollie Dashboard <https://my.mollie.com/dashboard/login>`_.
#. Go to :menuselection:`Payments` in the top menu, then click :guilabel:`API keys`.
#. :guilabel:`Copy` the :guilabel:`Live API Key` (or the :guilabel:`Test API Key` if you
wish to test the integration without affecting live transactions) and save it for the
:ref:`payment_providers/mollie/configure_odoo` step.
.. _payment_providers/mollie/configure_odoo:
Odoo configuration
==================
#. :ref:`Navigate to the payment provider Mollie <payment_providers/add_new>`
#. Fill in the :guilabel:`API Key` with the value :ref:`previously saved
<payment_providers/mollie/configure_dashboard>`.
#. Configure the remaining options as needed.
#. Set the :guilabel:`State` field to :guilabel:`Enabled` (or :guilabel:`Test Mode` if you
want to :ref:`test the integration without affecting live transactions <payment_providers/test-mode>`).
Configuration
=============
.. seealso::
:doc:`../payment_providers`
- :ref:`payment_providers/add_new`
Credentials tab
---------------
Odoo needs your **API Credentials** to connect with your Mollie account, which comprise:
- **API Key**: The test or live API Key depending on the configuration of the provider.
You can copy your credentials from your Mollie account, and paste them in the related fields under
the **Credentials** tab.
To retrieve your API key, log into your Mollie account, go to
:menuselection:`Developers --> API keys`, and copy your Test or Live **API Key**.
.. important::
If you are trying Mollie as a test, with the Test API key, change the **State** to *Test Mode*.
We recommend doing this on a test Odoo database, rather than on your main database.
.. seealso::
- :doc:`../payment_providers`

View File

@@ -66,10 +66,7 @@ Stripe configuration
#. Go to `the API keys page on Stripe <https://dashboard.stripe.com/account/apikeys>`_, or log into
your Stripe dashboard and go to :menuselection:`Developers --> API Keys`.
#. In the :guilabel:`Standard keys` section, copy the :guilabel:`Publishable key` and the
:guilabel:`Secret key` and save them for the :ref:`payment_providers/stripe/odoo-configuration`
step.
.. _payment_providers/stripe/odoo-configuration:
:guilabel:`Secret key` and save them for later.
Odoo configuration
------------------

View File

@@ -201,15 +201,6 @@ Redirections
If the database is hosted on **Odoo Online** or **Odoo.sh**, using redirections is recommended. They
allow messages to be received without delay in the database.
.. warning::
When configuring email redirections with Microsoft 365 (Exchange Online), be aware that certain
technical limitations may affect your setup. Some users have reported that Microsoft 365 does not
support true redirection and only allows forwarding, which may not behave as needed for Odoo's
email routing.
For more information on Microsoft Exchange configuration, visit `Microsoft Learn
<https://learn.microsoft.com/en-us/exchange/exchange-online>`_.
It is mandatory to redirect the catchall and bounce address to the Odoo subdomain of the database.
Every other alias used must be redirected as well.

View File

@@ -18,6 +18,9 @@ and used throughout the inventory process.
.. seealso::
Set up :doc:`../setup/rfid`
.. important::
If using Odoo 18, |GS1|'s Encoder/Decoder tool **must** be used to retrieve EPCs.
.. _barcode/operations/retrieve_epcs_gs1:
Retrieving EPCs from GS1
@@ -34,30 +37,6 @@ To retrieve an EPC to encode on a tag, use `GS1's EPC Encoder/Decoder tool
.. image:: retrieve_epcs/retrieve-from-gs1.png
:alt: Complete the fields of the EPC Encoder/Decoder tool.
.. _barcode/operations/retrieve_epcs_odoo:
Generating EPCs in Odoo
=======================
Generate EPCs for tracked products directly in Odoo. Products should be tracked by serial number,
but this is not a requirement. A GTIN-14-compatible
To retrieve the EPCs for a receipt of products:
#. On the receipt, click the :icon:`fa-list` :guilabel:`Detailed Operations` button next to the
:guilabel:`Quantity` field. The :guilabel:`Detailed Operations` box opens.
#. From here, specify or generate serial numbers for the products. Be sure to save the serial
numbers.
#. :guilabel:`Validate` the receipt.
#. Click the :guilabel:`Moves` smart button. Select all received items, then click the
:icon:`fa-cog` :guilabel:`Actions` button, then select :guilabel:`Export`.
#. On the :guilabel:`Export Data` screen, select :guilabel:`Electronic Product Code` from the list
of available fields, then click :guilabel:`Export`. The file downloads to the device. All of the
EPCs for the receipt are included in that file.
.. note::
EPCs can be exported from any :guilabel:`Moves` list, not just receipts.
.. _barcode/operations/write_epcs:
Writing EPCs to RFID tags

View File

@@ -3,11 +3,13 @@ Landed costs
============
.. |RfQ| replace:: :abbr:`RfQ (Request for Quotation)`
.. |RfQs| replace:: :abbr:`RfQs (Requests for Quotation)`
.. |PO| replace:: :abbr:`PO (Purchase Order)`
.. |FIFO| replace:: :abbr:`FIFO (First In First Out)`
.. |AVCO| replace:: :abbr:`AVCO (Average Costing)`
When shipping products to customers, the landed cost is the total price of a product or shipment,
including all expenses associated with shipping the product.
In Odoo, the *Landed Costs* feature is used to take additional costs into account when calculating
the valuation of a product. This includes the cost of shipment, insurance, customs duties, taxes,
and other fees.
@@ -35,16 +37,15 @@ Create landed cost product
==========================
For charges that are consistently added as landed costs, a landed cost product can be created in
Odoo. This way, a landed cost product can be quickly added to a request for quotation (|RfQ|) or a
vendor bill as an invoice line, instead of having to be manually entered every time a new vendor
bill is created.
Odoo. This way, a landed cost product can be quickly added to a vendor bill as an invoice line,
instead of having to be manually entered every time a new vendor bill is created.
To do this, create a new product by going to :menuselection:`Inventory app --> Products -->
Products`, and clicking :guilabel:`New`.
Assign a name to the landed cost product in the :guilabel:`Product Name` field (i.e. `International
Shipping`). In the :guilabel:`Product Type` field, select :guilabel:`Service` as the
:guilabel:`Product Type`.
Shipping`). In the :guilabel:`Product Type` field, click the drop-down menu, and select
:guilabel:`Service` as the :guilabel:`Product Type`.
.. important::
Landed cost products **must** have their :guilabel:`Product Type` set to :guilabel:`Service`.
@@ -64,8 +65,7 @@ appears below it, prompting a selection. Clicking that drop-down menu reveals th
.. image:: landed_costs/integrating-landed-costs-landed-cost-product.png
:alt: Is a Landed Cost checkbox and Default Split Method on service type product form.
When creating new |RfQs|, this product can be added as an invoice line as a landed cost. This
product can also be added to vendor bills that are in the draft state.
When creating new vendor bills, this product can be added as an invoice line as a landed cost.
.. important::
To apply a landed cost on a vendor bill, products in the original |PO| **must** belong to a
@@ -74,12 +74,12 @@ product can also be added to vendor bills that are in the draft state.
Create purchase order
=====================
Navigate to :menuselection:`Purchase app --> New` to create a new |RfQ|. In the :guilabel:`Vendor`
field, add a vendor to order products from. Then, click :guilabel:`Add a product`, under the
:guilabel:`Products` tab, to add products to the |RfQ|.
Navigate to :menuselection:`Purchase app --> New` to create a new request for quotation (RfQ). In
the :guilabel:`Vendor` field, add a vendor to order products from. Then, click :guilabel:`Add a
product`, under the :guilabel:`Products` tab, to add products to the |RfQ|.
Once ready, click :guilabel:`Confirm Order` to confirm the order. Then, click :guilabel:`Receive`
once the products have been received, followed by :guilabel:`Validate`.
Once ready, click :guilabel:`Confirm Order` to confirm the order. Then, click :guilabel:`Receive
Products` once the products have been received, followed by :guilabel:`Validate`.
Create vendor bill
------------------
@@ -88,16 +88,15 @@ Once the vendor fulfills the |PO| and sends a bill, a vendor bill can be created
Odoo.
Navigate to the :menuselection:`Purchase app`, and click into the |PO| for which a vendor bill
should be created. Then, upload the bill or click the :guilabel:`Bill Matching` smart button to
match with an existing bill. This opens a new :guilabel:`Vendor Bill` in the :guilabel:`Draft`
stage.
should be created. Then, click :guilabel:`Create Bill`. This opens a new :guilabel:`Vendor Bill` in
the :guilabel:`Draft` stage.
In the :guilabel:`Bill Date` field, click the line to open a calendar popover menu, and select the
date on which this draft bill should be billed.
Click :guilabel:`Add a line`. Add the landed cost product to the vendor bill.
Click the :icon:`fa-cloud-upload` :guilabel:`(Save)` icon to manually save and update the
Then, under the :guilabel:`Invoice Lines` tab, click :guilabel:`Add a line`, and click the drop-down
menu in the :guilabel:`Product` column to select the previously-created landed cost product. Click
the :icon:`fa-cloud-upload` :guilabel:`(cloud with arrow)` icon to manually save and update the
draft bill.
.. image:: landed_costs/integrating-landed-costs-checkboxes.png
@@ -115,13 +114,14 @@ Additionally, at the top of the form, a :guilabel:`Create Landed Costs` button a
Add landed cost
===============
Click :guilabel:`Create Landed Costs` at the top of the vendor bill.
Once a landed cost is added to the vendor bill, click :guilabel:`Create Landed Costs` at the top of
the vendor bill.
Doing so automatically creates a landed cost record, with a set landed cost pre-filled in the
product line in the :guilabel:`Additional Costs` tab.
From the :guilabel:`Landed Cost` form, click the :guilabel:`Transfers` drop-down menu, and select
which transfer the landed cost belongs to. Only validated transfers can be selected.
which transfer the landed cost belongs to.
.. image:: landed_costs/integrating-landed-costs-transfers-menu.png
:alt: Landed cost form with selected receipt transfer.
@@ -136,17 +136,28 @@ After setting the picking from the :guilabel:`Transfers` drop-down menu, click :
Click the :guilabel:`Valuation Adjustments` tab to see the impact of the landed costs. The
:guilabel:`Original Value` column lists the original price of the |PO|, the :guilabel:`Additional
Landed Cost` column displays the landed cost, and the :guilabel:`New Value` column displays the sum
of the two, for the total cost of the |PO|.
Landed Cost` column displays the landed cost, and the :guilabel:`New Value` displays the sum of the
two, for the total cost of the |PO|.
Once ready, click :guilabel:`Validate` to post the landed cost entry to the accounting journal.
This causes a :guilabel:`Valuation` smart button to appear at the top of the form. Click the
:guilabel:`Valuation` smart button to open a :guilabel:`Stock Valuation` page, with the product's
updated valuation listed.
.. note::
Each journal entry created for a landed cost on a vendor bill can be viewed in the
:menuselection:`Accounting` app.
For a :guilabel:`Valuation` smart button to appear upon validation, the product's
:guilabel:`Product Type` **must** be set to :guilabel:`Storable`.
To view the valuation of *every* product, including landed costs, navigate to
:menuselection:`Inventory app --> Reporting --> Valuation`.
.. note::
Each journal entry created for a landed cost on a vendor bill can be viewed in the *Accounting*
app.
To locate these journal entries, navigate to :menuselection:`Accounting app --> Accounting -->
Journal Entries`, and locate the correct entry, by number (e.g. `STJ/2025/XXXXX`).
Journal Entries`, and locate the correct entry, by number (i.e. `PBNK1/2024/XXXXX`).
Click into the journal entry to view the :guilabel:`Journal Items`, and other information about
the entry.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 70 KiB

View File

@@ -4,11 +4,6 @@
Delivery methods
================
In Odoo, *delivery methods* make it possible to calculate shipping costs directly on sales orders
and e-commerce carts, providing customers and sales teams with accurate shipping fee information.
This transparency helps close sales by showing customers the exact cost for each shipping carrier or
delivery timeframe.
When activated in Odoo, the *Delivery Methods* setting adds the option of calculating the cost of
shipping on sales orders and e-commerce shopping carts.
@@ -23,11 +18,11 @@ are calculated based on the carrier's pricing information.
Configuration
=============
To calculate shipping on sales orders and e-commerce, the **Delivery Costs** module must be
installed. To do so, navigate to the :menuselection:`Apps` application from the main Odoo dashboard.
To calculate shipping on sales orders and e-commerce, the *Delivery Costs* module must be installed.
To do so, navigate to the :menuselection:`Apps` application from the main Odoo dashboard.
Then, remove the :guilabel:`Apps` filter, and type in `Delivery Costs` in the search bar. After
finding the :guilabel:`Delivery Costs` module, click :guilabel:`Install` to install it.
Then, remove the :guilabel:`Apps` filter, and type in `Delivery Costs` in the :guilabel:`Search...`
bar. After finding the :guilabel:`Delivery Costs` module, click :guilabel:`Activate` to install it.
.. image:: setup_configuration/install-module.png
:alt: Install the Delivery Costs module.
@@ -37,34 +32,27 @@ finding the :guilabel:`Delivery Costs` module, click :guilabel:`Install` to inst
Add shipping
============
Shipping methods are added to sales orders in the form of delivery products, which appear as
Shipping methods can be added to sales orders in the form of delivery products, which appear as
individual line items. First, navigate to the desired sales order by going to :menuselection:`Sales
app --> Orders --> Orders`.
Open the desired sales order, then click the :guilabel:`Add shipping` button. The :guilabel:`Add a
shipping method` pop-up window opens. Then, using the drop-down menu, select an available shipping
method.
On the sales order, click the :guilabel:`Add shipping` button, which opens the :guilabel:`Add a
shipping method` pop-up window. Then, choose a :guilabel:`Shipping Method` from the list.
The :guilabel:`Total Order Weight` is pre-filled based on product weights (that are defined in the
:ref:`Inventory <inventory/product_management/manufacture>` tab for each product form). Edit the
field to specify the exact weight, and then click :guilabel:`Add` to add the shipping method.
:guilabel:`Inventory` tab for each product form). Edit the field to specify the exact weight, and
then click :guilabel:`Add` to add the shipping method.
.. important::
.. note::
The amount defined in :guilabel:`Total Order Weight` overwrites the total product weights defined
on the product form.
.. note::
Some connected shipping methods require obtaining rates from the carrier. In this situation,
click the :icon:`oi-arrow-right` :guilabel:`Get rate` button, and the shipping costs are
automatically updated from the carrier. These rates cannot be modified.
The shipping cost is added as a line item in the :guilabel:`Order Lines` tab as the
:guilabel:`Delivery Product` detailed on the shipping method form.
The shipping cost is added to the *sales order line* as the :guilabel:`Delivery Product` detailed on
the shipping method form.
.. example::
A customer purchased a left-sided desk with storage and requested the item be delivered by hand.
This delivery method is defined as `Furniture Delivery (Manual)` and has a cost of `$200`. The
sales order contains two line items: one for the desk, and another for the delivery method.
`Furniture Delivery`, a delivery product with a fixed rate of `$200`, is added to sales order
`S00088`.
.. image:: setup_configuration/delivery-product.png
:alt: Show delivery order on the sales order line.
@@ -73,9 +61,7 @@ Delivery order
--------------
The shipping method added to the sales order is linked to the shipping carrier details on the
delivery order. After confirming the order, a :icon:`fa-truck` :guilabel:`Delivery` smart button
appears at the top of the page. Click the :icon:`fa-truck` :guilabel:`Delivery` smart button to open
the warehouse delivery form. To add or change the delivery method on the delivery itself, open the
delivery order. To add or change the delivery method on the delivery itself, go to the
:guilabel:`Additional Info` tab and modify the :guilabel:`Carrier` field.
.. image:: setup_configuration/delivery-order.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@@ -33,9 +33,9 @@ a form to provide details about the shipping provider, including:
- :guilabel:`Delivery Method` (*Required field*): the name of the delivery method (e.g. `flat-rate
shipping`, `same day delivery`, etc.).
- :guilabel:`Website`: configure shipping methods for an **eCommerce** page. Select the applicable
website from the drop-down menu, or leave it blank to apply the method to all web pages. This
field only appears when the **eCommerce** app is enabled.
- :guilabel:`Website`: configure :doc:`delivery methods for an ecommerce
</applications/websites/ecommerce/shipping>`. Select the applicable website from the drop-down
menu, or leave it blank to apply the method to all web pages.
- :guilabel:`Provider` (*Required field*): choose the delivery service, like FedEx, if using a
:ref:`third-party carrier <inventory/shipping/third_party>`. Ensure the integration with the
shipping carrier is properly installed and select the provider from the drop-down menu. For more
@@ -46,12 +46,10 @@ a form to provide details about the shipping provider, including:
<payment_providers/inperson_payments/cash_on_delivery>` payment method when selecting this
delivery option on the ecommerce website.
- :guilabel:`Company`: If the shipping method should apply to a specific company, select it from the
drop-down menu. Leave the field blank to apply the method to all companies. This field only
appears in multi-company databases.
drop-down menu. Leave the field blank to apply the method to all companies.
- :guilabel:`Routes`: select the applicable routes to define different delivery methods, such as
standard or express shipping, based on varying lead times. This field only appears when you have
enabled multi-step routes in your inventory configuration settings. For more information, refer to
the :ref:`Set routes on shipping method <inventory/shipping_receiving/shipping-route>` section.
standard or express shipping, based on varying lead times. For more information, jump to the
:ref:`Set routes on shipping method <inventory/shipping_receiving/shipping-route>` section.
- :guilabel:`Delivery Product` (*Required field*): the product listed on the :ref:`sales order line
<inventory/shipping/sales-order>` as the delivery charge.
- :guilabel:`Free if order amount is above`: checking this box enables free shipping if the customer
@@ -60,17 +58,6 @@ a form to provide details about the shipping provider, including:
delivery. When a custom carrier is added in a delivery order, the tracking button is enabled, and
the link directs to the tracking portal with that URL.
.. example::
To set up `$200` flate-rate shipping, fill in the following fields:
- :guilabel:`Delivery Method`: `Furniture Delivery (Manual)`
- :guilabel:`Provider`: :guilabel:`Fixed Price`
- :guilabel:`Fixed Price`: `200`
- :guilabel:`Delivery Product`: :guilabel:`Furniture Delivery (manual)`
.. image:: new_delivery_method/sample-delivery-method.png
:alt: Set up a delivery method with a fixed price of 200.
.. _inventory/shipping_receiving/availability:
Use the :guilabel:`Availability` tab to define conditions for the delivery method based on the

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

@@ -14,25 +14,39 @@ vendor. Vendor bills record payables as they arrive from vendors, and can includ
the goods and/or services purchased, sales taxes, freight and delivery charges, and more.
In Odoo, a vendor bill can be created at different points in the purchasing process, depending on
the *bill control* policy selected on the product's settings.
the *bill control* policy chosen in the *Purchase* app's settings.
Bill control policies
=====================
To configure a product's bill control policy, navigate to :menuselection:`Purchase app --> Products
Products`, and click on the desired product to open it. Then, click on the :guilabel:`Purchase` tab.
Under the *Vendor Bills* section, the *Control Policy* field lists two policy options:
To configure the default bill control policy, navigate to :menuselection:`Purchase app -->
Configuration --> Settings`, and scroll to the :guilabel:`Invoicing` section.
- :guilabel:`On ordered quantities`: creates a vendor bill as soon as a purchase order is confirmed.
The :guilabel:`Bill Control` feature lists two policy options: :guilabel:`Ordered quantities` and
:guilabel:`Received quantities`.
The policy selected acts as the default for any new product created. Each policy acts as follows:
- :guilabel:`Ordered quantities`: creates a vendor bill as soon as a purchase order is confirmed.
The products and quantities in the purchase order are used to generate a draft bill.
- :guilabel:`On received quantities`: a bill is only created **after** all (or part) of the total
order has been received. The products and quantities received are used to generate a draft bill.
- :guilabel:`Received quantities`: a bill is only created **after** all (or part) of the total order
has been received. The products and quantities received are used to generate a draft bill.
.. image:: manage/manage-configuration-settings.png
:alt: Bill control policies on a product record.
:align: center
:alt: Bill control policies in purchase app settings.
Once a policy is selected, click :guilabel:`Save` to save the changes.
.. tip::
If a product needs a different control policy than the one set in the *Purchase* app settings,
that product's control policy can be overridden by going to the :guilabel:`Purchase` tab on a
product form, and selecting the desired policy in the :guilabel:`Control Policy` field.
.. image:: manage/manage-product-form.png
:align: center
:alt: Control policy field on product form.
3-way matching
--------------
@@ -48,6 +62,105 @@ Tick the checkbox next to :guilabel:`3-way matching`, and click :guilabel:`Save`
The :guilabel:`3-way matching` feature is **only** intended to work with the :guilabel:`Bill
Control` policy set to :guilabel:`Received quantities`.
Create and manage vendor bills on receipts
==========================================
When products are received into a company's warehouse, receipts are created. Once the company
processes the received quantities, they can choose to create a vendor bill directly from the
warehouse receipt form.
Depending on the bill control policy chosen in the settings, vendor bill creation is completed at
different steps of the procurement process.
Ordered quantities
------------------
To create and manage vendor bills for receipts with the *Bill Control* policy set to *Ordered
Quantities*, first navigate to the :menuselection:`Purchase app`, and click :guilabel:`New` from the
:guilabel:`Requests for Quotation` dashboard.
Doing so opens a new :guilabel:`Request for Quotation` (RfQ) form. On the blank |RfQ| form, add a
:guilabel:`Vendor`, and click :guilabel:`Add a line` under the :guilabel:`Product` tab to add
products to the order.
On the product line, select a product from the drop-down menu in the :guilabel:`Product` field, and
enter the quantity to order in the :guilabel:`Quantity` field.
Once ready, click :guilabel:`Confirm Order` to confirm the |RfQ| into a |PO|.
Then, click :guilabel:`Create Bill` to create a vendor bill. This opens a :guilabel:`Vendor Bill`
form in the :guilabel:`Draft` state. From here, add a billing date in the :guilabel:`Bill Date`
field.
Once ready, confirm the bill by clicking :guilabel:`Confirm` on the :guilabel:`Vendor Bill` page.
.. tip::
Since the bill control policy is set to *Ordered quantities*, the draft bill can be confirmed as
soon as it is created, before any products have been received.
Once a payment has been received, click :guilabel:`Register Payment` at the top of the bill to
record it.
Doing so causes a :guilabel:`Register Payment` pop-up window to appear, wherein a payment
:guilabel:`Journal` can be chosen, and a :guilabel:`Payment Method` selected.
Additionally, the bill :guilabel:`Amount`, :guilabel:`Payment Date`, and :guilabel:`Memo`
(:dfn:`Reference Number`) can be edited from this pop-up window, if necessary.
Once ready, click :guilabel:`Create Payment` to finish creating the :guilabel:`Vendor Bill`. Doing
so displays a green :guilabel:`Paid` banner on the |RfQ| form.
.. image:: manage/manage-draft-vendor-bill.png
:align: center
:alt: Vendor bill form for ordered quantities control policy.
Received quantities
-------------------
To create and manage vendor bills for receipts with the bill control policy set to *Received
quantities*, first navigate to the :menuselection:`Purchase` app, and click :guilabel:`New`.
Doing so opens a new |RfQ| form. On the blank |RfQ| form, add a :guilabel:`Vendor`, and click
:guilabel:`Add a line` under the :guilabel:`Product` tab to add products to the order.
On the product line, select a product from the drop-down menu in the :guilabel:`Product` field, and
enter the quantity to order in the :guilabel:`Quantity` field.
Once ready, click :guilabel:`Confirm Order` to confirm the |RfQ| into a |PO|.
.. important::
When using the *Received quantities* control policy, clicking :guilabel:`Create Bill` before any
products are received causes an :guilabel:`Invalid Operation` pop-up window to appear.
Odoo requires at least partial quantities of the items included in the |PO| to be received in
order to create a vendor bill.
.. image:: manage/manage-user-error-popup.png
:align: center
:alt: User error pop-up for received quantities control policy.
On the |PO|, click the :guilabel:`Receipt` smart button to view the warehouse receipt form.
From here, click :guilabel:`Validate` to register the :guilabel:`Done` (received) quantities.
Then, navigate back to the |PO|, via the breadcrumb, and click :guilabel:`Create Bill`.
This opens a :guilabel:`Vendor Bill` form in the :guilabel:`Draft` state. From here, add a billing
date in the :guilabel:`Bill Date` field. Once ready, confirm the bill by clicking
:guilabel:`Confirm` at the top of the draft.
Once a payment has been received, click :guilabel:`Register Payment` at the top of the bill to
record it.
Doing so causes a :guilabel:`Register Payment` pop-up window to appear, wherein a payment
:guilabel:`Journal` can be chosen, and a :guilabel:`Payment Method` selected.
Additionally, the bill :guilabel:`Amount`, :guilabel:`Payment Date`, and :guilabel:`Memo`
(:dfn:`Reference Number`) can be edited from this pop-up window, if necessary.
Once ready, click :guilabel:`Create Payment` to finish creating the :guilabel:`Vendor Bill`. Doing
so displays a green :guilabel:`Paid` banner on the |RfQ| form.
Manage vendor bills in Accounting
=================================

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

View File

@@ -45,7 +45,7 @@ Instructions often include:
- A purpose, or what the topic covers
- Rules or constraints for the agent to follow when assigned this topic
- Step-by-step workflows for how to complete a specific action
- Step-by-step workflows for how to complete a specfic action
- Technical details needed to complete any actions
Agent structure
@@ -58,18 +58,15 @@ Topics
*Topics* are a collection of instructions and :ref:`tools <ai/tools>` that define how an agent
behaves within a specific context. Essentially, the topics define what an agent can do within the
database. Topics guide conversations, telling the agent what it can do, how it can do it, and when
it should do it.
database.
.. important::
If an agent is not assigned any Topics, it is only able to provide information, not complete
tasks or make changes to the database.
Within each topic includes a detailed prompt, which provides the agent with more in-depth
instructions on how to perform the tasks associated with that topic, define the boundaries of its
behavior, and determine how it should interpret user intent. These prompts ensure that the agent
follows a consistent reasoning pattern and uses the appropriate tools to generate accurate,
context-aware responses.
Topics guide conversations, telling the agent what it can do, how it can do it, and when it should
do it. Within each topic includes a detailed prompt, which provides the agent with more in-depth
instructions on how to perform the
The following topics are preconfigured in the **AI** app:

View File

@@ -6,8 +6,8 @@ Payment methods
Configure a payment method with Odoo Point of Sale to provide customers with various payment
options, including cash, card payments through a :ref:`configured payment terminal
<pos/terminals/configuration>`, :doc:`online payments <../../finance/payment_providers>`, or
:doc:`customer accounts <payment_methods/customer_credit>`.
<pos/terminals/configuration>`, :doc:`online payments </applications/finance/payment_providers>`,
or :doc:`customer accounts <payment_methods/customer_credit>`.
To create a payment method, go to :menuselection:`Point of Sale --> Configuration --> Payment
Methods`, click :guilabel:`New`, and follow the next steps:
@@ -16,12 +16,12 @@ Methods`, click :guilabel:`New`, and follow the next steps:
#. Enable the following options if needed:
- :guilabel:`Online Payment`: To link the payment method to a :doc:`payment provider
<../../finance/payment_providers>` and enable online payments, select a provider in
</applications/finance/payment_providers>` and enable online payments, select a provider in
the :guilabel:`Allowed Providers` field or click :icon:`fa-arrow-right` :guilabel:`Payment
Providers` to install one.
- :guilabel:`Identify Customer`: Force the selection of a customer during the payment.
#. Select the preferred :doc:`Journal <../../finance/accounting/get_started/journals>` to record all
transactions.
#. Select the preferred :doc:`Journal </applications/finance/accounting/get_started/journals>` to
record all transactions.
#. Select the appropriate :guilabel:`Point of Sale` to enable the payment method.
#. Set the :guilabel:`Integration` field to one of the following options:
@@ -30,17 +30,16 @@ Methods`, click :guilabel:`New`, and follow the next steps:
payments.
- :guilabel:`Bank App (QR Code)`: Add at least one :ref:`bank account
<accounting/journals/bank>` to the journal to enable :doc:`QR code payments
<payment_methods/qr_code_payment>` with a bank app. Select a :guilabel:`QR Code Format` in the
form.
- :guilabel:`Cash Machine (Glory)`: Connect a :doc:`Glory <payment_methods/cash_machines/glory>`
:doc:`cash machine <payment_methods/cash_machines>` to automate the point of sale's cash
transactions.
</applications/sales/point_of_sale/payment_methods/qr_code_payment>` with a bank app. Select a
:guilabel:`QR Code Format` in the form.
- :guilabel:`Cash Machine (Glory)`: Connect a **Glory** cash machine to automate the point of
sale's cash transactions.
#. Save.
.. note::
- The :guilabel:`Delivery Payment` option links a payment method to online orders placed through
:doc:`Urban Piper <online_food_delivery>`. Select the appropriate :guilabel:`Delivery Provider`
to associate with the payment method.
:doc:`Urban Piper </applications/sales/point_of_sale/online_food_delivery>`. Select the
appropriate :guilabel:`Delivery Provider` to associate with the payment method.
- If the Accounting app is installed, use the :guilabel:`Intermediary Account` field, if needed,
to record transactions for this payment method in a specific receivable account for
better traceability. Leave the field empty to use the company's default :ref:`receivable
@@ -56,12 +55,10 @@ Methods`, click :guilabel:`New`, and follow the next steps:
.. seealso::
- `Payment methods (video tutorial) <https://www.youtube.com/watch?v=eHr4tS8Wmss>`_
- :doc:`payment_methods/terminals`
- :doc:`payment_methods/cash_machines`
.. toctree::
:titlesonly:
payment_methods/cash_machines
payment_methods/customer_credit
payment_methods/qr_code_payment
payment_methods/terminals

View File

@@ -1,39 +0,0 @@
:show-content:
=============
Cash machines
=============
Connecting and integrating a cash machine with a :ref:`POS system <pos/session-start>` enables
automation of cash transactions, cash counting, and change return.
.. _pos/cash_machines/configuration:
Configuration
=============
Configure the cash machine itself before setting it up in Odoo. Currently, Odoo supports :doc:`Glory
<cash_machines/glory>` cash machines. Once the cash machine is fully set up:
#. Create the associated :doc:`payment method <../payment_methods>`.
#. Select the POS in the :guilabel:`Point of Sale` field.
.. _pos/terminals/cash-machine-use:
Use
===
To process a :ref:`payment <pos/sell>` with a :ref:`configured cash machine
<pos/cash_machines/configuration>`, select the machine's :doc:`payment method <../payment_methods>`
on the **payment screen**, then follow the instructions on the machine.
Once the transaction is successful, the payment is automatically validated in Point of Sale.
.. note::
- Connection issues between Odoo and the cash machine result in transaction cancellation.
- To cancel the payment request, click :guilabel:`Cancel`.
.. toctree::
:titlesonly:
cash_machines/glory

View File

@@ -1,130 +0,0 @@
=====
Glory
=====
**Glory** :doc:`cash machines <../cash_machines>` enable the automation of cash transactions.
.. note::
- The integration with the Glory cash machine only supports basic functions, such as cash
transactions and cash count checks.
- Tasks like filling and emptying the machine must be performed directly through the cash machine
interface.
.. _pos/glory/configuration:
Configuration
=============
Cash machine settings
---------------------
#. Power on the cash machine, which briefly displays its IP address at the bottom of the screen.
Note it down for later.
.. note::
The IP address should be formatted as `###.###.#.##` (e.g., `192.168.0.25`).
#. Navigate to the cash machine's homepage by entering its IP address as the URL in `HTTPS` (e.g.,
`https://192.168.0.25`), and log in with your Glory credentials.
#. As long as the certificate is not imported, a warning page appears when trying to access the
machine's homepage. Bypass it by clicking :guilabel:`Advanced` and then :guilabel:`Proceed to
[IP address] (unsafe)`.
#. From the Glory homepage, go to :guilabel:`Host Configuration` and ensure the :guilabel:`Network`
setting is set to :guilabel:`MANUAL`, meaning the IP address is static.
#. Then, navigate to :guilabel:`SSL Configuration` and scroll down to the :guilabel:`HTTPS Server
Setting` section.
#. In parallel, open the terminal and verify that *OpenSSL* is installed. Type `openssl` and
press enter. If installed, this command displays a `help` menu listing all available OpenSSL
commands. If nothing happens, `install it <https://openssl-library.org/source/>`_.
#. Then, paste the following command and press `Enter` to generate and download the certificate
and private key. Ensure that you replace the demo IP address with the cash machines actual IP
address.
.. code-block:: bash
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -sha256 -days 3650 -nodes -subj "/CN=192.168.0.25" -addext "subjectAltName = IP:192.168.0.25"
.. important::
The self-signed SSL certificate and key pair must use the same static IP address as the
cash machine.
#. Once the files are generated, from the :guilabel:`HTTPS Server Setting` section, upload
`cert.pem` as the :guilabel:`Certificate` and `key.pem` as the :guilabel:`Private Key`.
#. Go to :guilabel:`WebApp Configuration` and ensure the :guilabel:`Interface` setting from the
:guilabel:`A: Nodejs Setting` section is set to :guilabel:`Enable`.
#. Then, adjust the following settings depending on the POS setup:
- If **multiple POS** are connected to the same cash machine, go to :guilabel:`App
Configuration`, scroll down to the :guilabel:`SOAP IF Setting`, and ensure :guilabel:`Session
mode` and :guilabel:`Occupy mode` are both set to :guilabel:`Enable`.
- If **a dedicated user** has been set up on the cash machine for Odoo, go to :guilabel:`App
Configuration`, scroll down to the :guilabel:`SOAP IF Setting` section, and :guilabel:`Enable`
the :guilabel:`User check` setting.
#. Restart the cash machine to apply the new settings.
.. note::
As this setup is complex and may involve advanced knowledge of Glory hardware, it is advisable to
consult the Glory integration partner for configuration if there is any uncertainty.
Import self-signed certificates
-------------------------------
For a long-term solution, the generated certificates must be imported into the device running the
POS. The import process is heavily dependent on the :abbr:`OS (Operating System)` and the browser.
.. tabs::
.. tab:: Windows OS
Windows manages certificates, which means that self-signed certificates must be imported
from the certification files rather than the browser. To do so,
#. Open the Windows File Explorer and locate the downloaded certification files.
#. Right-click on the certification files and select :guilabel:`Install Certificate`.
#. Specify the certificate location and select the installation scope: either the
:guilabel:`Current User` only or all users (:guilabel:`Local Machine`). Then, click
:guilabel:`Next`.
#. On the `Certificate Store` screen, tick :guilabel:`Place all certificates in the following
store`, click :guilabel:`Browse...`, and select :guilabel:`Trusted Root Certification
Authorities`.
#. Click :guilabel:`Finish` and accept the pop-up security window.
#. Restart the computer to make sure that the changes are applied.
.. tab:: Linux OS
When using **Google Chrome**,
#. Open the web browser.
#. Navigate to :menuselection:`Settings --> Privacy and security --> Security --> Manage
certificates`.
#. Go to the :guilabel:`Authorities` tab, click :guilabel:`Import`, and select the exported
certification files.
#. Accept all warnings and click :guilabel:`ok`.
#. Restart the web browser.
When using **Mozilla Firefox**,
#. Open the web browser.
#. Navigate to :menuselection:`Settings --> Privacy & Security --> Security --> View
Certificates... --> Import`.
#. Select the exported certification files.
#. Tick the checkboxes and validate.
#. Restart the web browser.
Payment method
--------------
#. :ref:`Install <general/install>` the POS Glory Cash Machines module.
#. :doc:`Associate a cash payment method <../../payment_methods>`:
- Go to :menuselection:`Point of Sale --> Configuration --> Payment Methods`. Create a new
:guilabel:`Cash` payment method or update an existing payment method.
- Select the associated POS in the :guilabel:`Point of Sale` field.
- Select :guilabel:`Cash Machine (Glory)` in the :guilabel:`Integration` field.
- Fill in the :guilabel:`Cash Machine IP` field with the IP address of the cash machine.
- If the cash machine was configured to use :guilabel:`User check` in the previous section, fill
in the :guilabel:`Cash Machine Username` and :guilabel:`Cash Machine Password`.
.. seealso::
:doc:`../../payment_methods`

View File

@@ -31,6 +31,23 @@ designate :guilabel:`Unavailability` days.
Click **Save** to apply the changes.
Multi-location management and transfers
=======================================
Tracking the location of high-value physical products is essential. The **Rental** app helps by
facilitating rental transfers and creating stock deliveries and receipts for all rental orders.
For multi-location management and rental item transfer tracking, go to the :menuselection:`Inventory
app --> Configuration --> Settings` and in the :guilabel:`Warehouse` section, enable
:guilabel:`Storage Locations`. Click **Save** to apply the changes.
Next, navigate to :menuselection:`Inventory app --> Configuration --> Locations`. Click
:guilabel:`New` to configure a new internal location.
In the new location page, enter the :guilabel:`Location Name` and ensure that the :guilabel:`Parent
Location` field is :guilabel:`WH`. Click the :icon:`fa-cloud-upload` :guilabel:`(Save manually)`
icon near the top to save.
Rental products
===============
@@ -222,53 +239,6 @@ for record-keeping purposes, if necessary.
.. seealso::
`Odoo Tutorials: Sign <https://www.odoo.com/slides/sign-61>`_
Multi-location management and transfers
=======================================
Tracking the location of high-value physical products between locations is essential. The **Rental**
app helps with the *Rental Transfers* feature. Activating rental transfers means the system treats
rental movements similarly to sales, requiring a receipt and a delivery order every time a physical
product is rented or returned.
For multi-location management and rental item transfer tracking, navigate to the
:menuselection:`Rental app > Configuration > Settings` and in the :guilabel:`Rental` section, tick
the :guilabel:`Rental Transfers` checkbox.
.. image:: products/rental-transfers-checkbox.png
:alt: Sample of the Rental settings with the Rental Transfers enabled.
.. note::
The **Inventory** app automatically creates an internal default location once the *Rental
Transfers* feature is enabled. Odoo uses the new default location, :guilabel:`Customer/Rental`,
to track products during the rental period (moving them from :guilabel:`Stock` to
:guilabel:`Customer/Rental` upon rental, and back upon return). Do not modify to avoid corrupting
inventory tracking.
Next, go to the :menuselection:`Inventory app --> Configuration --> Settings` and in the
:guilabel:`Warehouse` section, tick the :guilabel:`Storage Locations` checkbox. Click
:guilabel:`Save` to apply the changes.
To configure new locations, navigate to :menuselection:`Inventory app --> Configuration -->
Locations`. Click :guilabel:`New` to configure a new internal location.
On the new location page, enter the :guilabel:`Location Name` and ensure the :guilabel:`Parent
Location` field is set to :guilabel:`WH`. Click the :icon:`fa-cloud-upload` :guilabel:`Save
manually` icon near the top to save.
.. example::
A bike rental business has two store locations within the same city. Both locations allow for
pick-up and drop-off of their bikes. The company wants to track its bikes accurately at each
location.
Ensure the **Rental** and **Inventory** apps are configured by enabling :guilabel:`Rental
Transfers` in the **Rental app** and :guilabel:`Storage Locations` in the **Inventory** app.
Next, go to the :menuselection:`Inventory app > Configuration > Locations`. Create a new location
for each storefront.
.. image:: products/configured-locations.png
:alt: Sample of internal inventory locations that represent different rental store locations.
Pickup products
===============

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

View File

@@ -2,7 +2,10 @@
Down payments
=============
A down payment is an initial up-front payment made during the confirmation of a sales transaction.
A down payment is an initial, up-front payment made during the confirmation of a sales transaction.
Down payments reduce the risk for both parties (the seller and the buyer) as they indicate a mutual
commitment to complete the sales transaction.
With a down payment, the buyer pays a portion of the total amount owed while agreeing to pay the
remaining amount at a later date. In turn, the seller provides goods or services to the buyer upon
or after accepting the down payment, trusting that the remaining amount will be paid later on.
@@ -13,16 +16,17 @@ transaction.
Create invoices
===============
When a sales order is confirmed, the option to create an invoice becomes available via the
When a sales order is confirmed, the option to create an invoice becomes available, via the
:guilabel:`Create Invoice` button. When clicked, a :guilabel:`Create invoice(s)` pop-up appears.
.. image:: down_payment/create-invoices-popup-form.png
:alt: Create invoice(s) pop-up form that appears in Odoo Sales.
:align: center
:alt: Create invoices pop-up form that appears in Odoo Sales.
.. note::
Invoices are automatically created as drafts so they can be reviewed before validation.
Invoices are automatically created as drafts, so they can be reviewed before validation.
On the :guilabel:`Create invoice(s)` pop-up, there are 3 options to choose from in the
On the :guilabel:`Create invoices` pop-up, there are 3 options to choose from in the
:guilabel:`Create Invoice` field:
- :guilabel:`Regular invoice`
@@ -37,195 +41,247 @@ On the :guilabel:`Create invoice(s)` pop-up window, the down payment options are
- :guilabel:`Down payment (percentage)`
- :guilabel:`Down payment (fixed amount)`
Select a down payment option and set the desired payment, either as a percentage or a fixed amount,
in the :guilabel:`Down Payment Amount` field.
Select the desired down payment option, then designate the desired amount, either as a percentage or
a fixed amount, in the :guilabel:`Down Payment Amount` field.
Once all fields are filled in, click the :guilabel:`Create Draft` button. Upon clicking this button,
Odoo reveals the :guilabel:`Customer Invoice Draft`.
.. important::
If an :guilabel:`Invalid Operation` error appears, double-check that the :doc:`invoicing policy
<invoicing_policy>` is configured correctly. In some cases, for example, the invoicing policy is
configured to require delivery before sending an invoice.
If an :guilabel:`Invalid Operation` error appears, double-check that the
:doc:`invoicing policy <invoicing_policy>` is configured correctly. In some cases, for example,
the invoicing policy is configured to require delivery before invoicing.
In the :guilabel:`Invoice Lines` tab of the :guilabel:`Customer Invoice Draft`, the down payment
that was just configured in the :guilabel:`Create invoice(s)` pop-up form appears under a new
:guilabel:`Down Payments` section.
that was just configured in the :guilabel:`Create invoices` pop-up form appears as a
:guilabel:`Product`.
.. _sales/invoicing/50-percent-down-payments:
Example: requesting a 50% down payment
======================================
Example: request 50% down payment
=================================
.. note::
The following example involves a 50% amount down payment on a (:guilabel:`Cabinet with Doors`)
with :guilabel:`Ordered quantities` as the :guilabel:`Invoicing Policy`.
The following example involves a 50% amount down payment on a product (:guilabel:`Cabinet with
Doors`) with :guilabel:`Ordered quantities` as the :guilabel:`Invoicing Policy`.
.. image:: down_payment/cabinet-product-details.png
:align: center
:alt: Cabinet with doors product form showcasing various details and fields.
Navigate to :menuselection:`Sales app --> New`, and add a :guilabel:`Customer` to the quotation.
.. seealso::
:doc:`invoicing_policy`
First, navigate to :menuselection:`Sales app --> New`, and add a :guilabel:`Customer` to the
quotation.
Then, click :guilabel:`Add a product` in the :guilabel:`Order Lines` tab, and select the
:guilabel:`Cabinet with Doors` product. When the order is confirmed (via the :guilabel:`Confirm`
button), the quotation turns into a sales order. Once this occurs, create and view the invoice by
clicking :guilabel:`Create Invoice`.
:guilabel:`Cabinet with Doors` product.
When the order is confirmed (via the :guilabel:`Confirm` button), the quotation turns into a sales
order. Once this occurs, create and view the invoice by clicking :guilabel:`Create Invoice`.
.. image:: down_payment/cabinet-sales-orders-confirmed.png
:align: center
:alt: Cabinet with doors sales order that's been confirmed in the Odoo Sales application.
Next, on the :guilabel:`Create invoice(s)` pop-up window that appears, select :guilabel:`Down
payment (percentage)`, and type `50` in the :guilabel:`Down Payment` field.
Next, on the :guilabel:`Create invoices` pop-up window that appears, select :guilabel:`Down payment
(percentage)`, and type `50` in the :guilabel:`Down Payment Amount` field.
.. note::
The :guilabel:`Income Account` attached to the :guilabel:`Down payment` can be changed. For more
information, check out the documentation on :ref:`income account modification on down payments
<sales/invoicing/income-account-modification>`. A :guilabel:`Down payment Account` can also be
set on a product category. If set, this account is prioritized for future down payments.
The :guilabel:`Income Account` attached to the :guilabel:`Down payment` product can be changed.
For more information, check out the documentation on :ref:`income account modification on down
payments <sales/invoicing/income-account-modification>`.
A :guilabel:`Down payment Account` can also be set on a product category. If set, this account is
prioritized.
Lastly, click :guilabel:`Create Draft Invoice` to create and view the invoice draft.
Clicking :guilabel:`Create Draft Invoice` reveals the draft invoice, which includes the down
payment as a :guilabel:`Product` in the :guilabel:`Invoice Lines` tab.
Lastly, click :guilabel:`Create Draft Invoice` to create and view the invoice draft, which includes
the down payment under the :guilabel:`Down Payments` section of the :guilabel:`Invoice Lines` tab.
From there, the invoice can be confirmed and posted by clicking :guilabel:`Confirm`. Confirming the
invoice changes the status from :guilabel:`Draft` to :guilabel:`Posted`. It also reveals a new
series of buttons at the top of the page.
.. image:: down_payment/draft-invoice-sample.png
:align: center
:alt: A sample draft invoice with down payment mentioned in Odoo Sales.
From those buttons, the payment can be registered by clicking :guilabel:`Pay`. Doing so reveals a
:guilabel:`Pay` pop-up form, which is auto-populated with the necessary information. Confirm the
information provided is correct, and make any necessary adjustments. When ready, click the
:guilabel:`Create Payment` button.
From those buttons, the payment can be registered by clicking :guilabel:`Register Payment`.
.. image:: down_payment/register-payment-button.png
:align: center
:alt: Showcase of the Register Payment button on a confirmed customer invoice.
Doing so reveals a :guilabel:`Register Payment` pop-up form, which is auto-populated with the
necessary information. Confirm the information provided is correct, and make any necessary
adjustments. When ready, click the :guilabel:`Create Payment` button.
.. image:: down_payment/register-payment-pop-up-window.png
:alt: Showcase of the Pay pop-up window with create payment button.
:align: center
:alt: Showcase of the Register Payment pop-up window with create payment button.
After clicking :guilabel:`Create Payment`, Odoo reveals the customer invoice, now with a green
:guilabel:`In Payment` or :guilabel:`Paid` banner in the upper-right corner, depending on how the
database has configured and if manual confirmation of payments is required.
:guilabel:`In Payment` banner in the upper-right corner.
.. image:: down_payment/customer-invoice-green-payment-banner.png
:alt: Customer Invoice with a green Paid banner located in the upper-right corner.
:align: center
:alt: Customer Invoice with a green In Payment banner located in the upper-right corner.
On the sales order, a new :guilabel:`Down Payments` section is present in the :guilabel:`Order
Lines` tab, along with the down payment that was just invoiced and posted. When the customer wants
to pay the remaining amount of the order, another invoice must be created.
Now, when the customer wants to pay the remaining amount of the order, another invoice must be
created. To do that, return to the sales order, via the breadcrumb links.
Back on the sales order, a new :guilabel:`Down Payments` section is present in the :guilabel:`Order
Lines` tab, along with the down payment that was just invoiced and posted.
.. image:: down_payment/down-payments-section-order-lines.png
:align: center
:alt: The down payments section in the order lines tab of a sales order.
Next, click the :guilabel:`Create Invoice` button. On the :guilabel:`Create invoice(s)` pop-up
window that appears, there is a new field: :guilabel:`Already invoiced` and :guilabel:`Amount to
invoice`.
Next, click the :guilabel:`Create Invoice` button.
On the :guilabel:`Create invoices` pop-up window that appears, there are two new fields:
:guilabel:`Already invoiced` and :guilabel:`Amount to invoice`.
.. image:: down_payment/create-invoices-pop-up-already-invoiced.png
:alt: The deduct down payment option on the Create invoice(s) pop up in Odoo Sales.
:align: center
:alt: The deduct down payment option on the create invoices pop up in Odoo Sales.
If the remaining amount is ready to be paid, select the :guilabel:`Regular Invoice` option. Odoo
will create an invoice for the exact amount needed to complete the total payment, as indicated in
the :guilabel:`Amount to invoice` field.
Once ready, click :guilabel:`Create Draft Invoice`. Doing so reveals another :guilabel:`Customer
Invoice Draft` page, listing all the invoices for that specific sales order in the
:guilabel:`Invoice Lines` tab. Each invoice line item displays all the necessary information related
to each invoice.
Once ready, click :guilabel:`Create Draft Invoice`.
To complete the flow, click :guilabel:`Confirm` to change the status of the invoice from
:guilabel:`Draft` to :guilabel:`Posted`. Then, click :guilabel:`Pay`. The :guilabel:`Pay` form
appears, with all fields auto-populated with the necessary information, including the remaining
amount left to be paid on the order.
Doing so reveals another :guilabel:`Customer Invoice Draft` page, listing *all* the invoices for
that specific sales order in the :guilabel:`Invoice Lines` tab. Each invoice line item displays all
the necessary information related to each invoice.
To complete the flow, click :guilabel:`Confirm`, which changes the status of the invoice from
:guilabel:`Draft` to :guilabel:`Posted`. Then, click :guilabel:`Register Payment`.
Once again, the :guilabel:`Register Payment` appears, with all fields auto-populated with the
necessary information, including the remaining amount left to be paid on the order.
.. image:: down_payment/second-register-payment-popup.png
:alt: The second Pay pop-up form in Odoo sales.
:align: center
:alt: The second register payment pop-up form in Odoo sales.
After confirming that information, click :guilabel:`Create Payment`. Doing so reveals the final
:guilabel:`Customer Invoice` with a green :guilabel:`In Payment` or :guilabel:`Paid` banner in the
upper-right corner, depending on how the database has configured and if manual confirmation of
payments is required. Upon returning to the sales order, both down payments are present in the
:guilabel:`Order Lines` tab.
:guilabel:`Customer Invoice` with a green :guilabel:`In Payment` banner in the upper-right corner.
Also, both down payments are present in the :guilabel:`Invoice Lines` tab.
.. image:: down_payment/final-sales-order.png
:alt: The second down payment invoice with Paid banner in Odoo Sales.
.. image:: down_payment/second-down-payment-in-payment-invoice.png
:align: center
:alt: The second down payment invoice with in payment banner in Odoo Sales.
At this point, the flow is now complete. This flow is also possible with the :guilabel:`Fixed
amount` down payment option.
At this point, the flow is now complete.
.. note::
This flow is also possible with the :guilabel:`Fixed amount` down payment option.
.. important::
If a down payment is used with a product that has a :guilabel:`Delivered quantities` invoicing
policy, and the cost of the product exceeds the 50% down payment, a regular invoice is created.
However, for products that cost less than the 50% down payment, the down payments will not be
able to be deducted when it comes time to invoice the customer. This is because the product(s)
would have to be delivered *before* creating the final invoice due to Odoo not allowing negative
totals for invoices. If nothing has been delivered, a :guilabel:`Credit Note` is created, which
cancels the draft invoice that was created after the down payment.
policy, and the cost of the product *exceeds* the 50% down payment (as in most cases), a regular
invoice is created.
To utilize the :guilabel:`Credit Note` option, the **Inventory** application must be installed in
However, for products that cost *less* than the 50% down payment, the down payments will **not**
be able to be deducted when it comes time to invoice the customer.
This is because the product(s) would have to be delivered *before* creating the final invoice due
to Odoo not allowing negative totals for invoices.
If nothing has been delivered, a :guilabel:`Credit Note` is created, which cancels the draft
invoice that was created after the down payment.
To utilize the :guilabel:`Credit Note` option, the *Inventory* application must be installed, in
order to confirm the delivery. Otherwise, the delivered quantity can be entered manually directly
on the sales order.
.. _sales/invoicing/100-percent-down-payments:
Example: requesting a 100% down payment
=======================================
Example: request 100% down payment
==================================
Requesting a 100% down payment is similar to requesting a :ref:`50% down payment
<sales/invoicing/50-percent-down-payments>`, but with fewer steps.
The process of requesting a 100% down payment is similar to the process of setting up a :ref:`50%
down payment <sales/invoicing/50-percent-down-payments>`, but with fewer steps.
.. note::
A 100% down payment is not the same as a full payment of the sales order. A sales order paid
through the regular invoice process will not allow any additional invoices to be generated and
will not display the :guilabel:`Create Invoice` button on the Sales Order. Instead, following
this example will cause the :guilabel:`Create Invoice` button to be displayed on the Sales Order.
This is because the system expects another invoice to be created after the down payment to
A 100% down payment is **not** the same as a full payment of the sales order.
A sales order paid through the regular invoice process will not allow any additional invoices to
be generated, and **will not** display the *Create Invoice* button on the Sales Order.
Following this example **will** cause the *Create Invoice* button to be displayed on the Sales
Order. This is because Odoo expects another invoice to be created after the down payment to
complete payment of the sales order.
The *Solar Panel Installation* product is being used in this example.
To configure a 100% down payment, navigate to :menuselection:`Sales app --> New` and add a
:guilabel:`Customer` to the quote. Next, click :guilabel:`Add a product` in the :guilabel:`Order
Lines` tab, and select the `Solar Panel Installation` product. Upon clicking the :guilabel:`Confirm`
button, the quotation turns into a sales order. At that point, an invoice can now be created by
clicking :guilabel:`Create Invoice` in the top-left corner. On the :guilabel:`Create invoice(s)`
pop-up window that appears, select :guilabel:`Down payment (percentage)`, and type `100` in the
:guilabel:`Down Payment` field.
To configure a 100% down payment, begin by navigating to :menuselection:`Sales app --> New`, and add
a :guilabel:`Customer` to the quote.
Next, click :guilabel:`Add a product` in the :guilabel:`Order Lines` tab, and select the
`Solar Panel Installation` product.
Upon clicking the :guilabel:`Confirm` button, the quotation turns into a sales order. At that point,
an invoice can now be created by clicking :guilabel:`Create Invoice` in the top-left corner.
On the :guilabel:`Create invoices` pop-up window that appears, select :guilabel:`Down payment
(percentage)`, and type `100` in the :guilabel:`Down Payment Amount` field.
.. image:: down_payment/100p-down-payment-percentage.png
:align: center
:alt: The Down payment (percentage) option selected with 100% set as the Down Payment.
Next, click :guilabel:`Create Draft Invoice` to create an invoice draft. This will also bring the
draft invoice into view, which includes the :guilabel:`Down payment` under the :guilabel:`Down
Payments` section of the :guilabel:`Invoice Lines` tab. The invoice can now be confirmed and posted
by clicking :guilabel:`Confirm`. Confirming the invoice changes the status from :guilabel:`Draft` to
:guilabel:`Posted`. It also reveals a new series of buttons at the top of the page.
draft invoice into view, which includes the :guilabel:`Down payment` as a :guilabel:`Product` in the
:guilabel:`Invoice Lines` tab.
The invoice can now be confirmed and posted by clicking :guilabel:`Confirm`. Confirming the invoice
changes the status from :guilabel:`Draft` to :guilabel:`Posted`. It also reveals a new series of
buttons at the top of the page.
The payment can be registered by clicking the :guilabel:`Register Payment` button.
Doing so reveals a :guilabel:`Register Payment` pop-up form, which is auto-populated with the
necessary information. Confirm the information provided is correct and make any necessary
adjustments. When ready, click the :guilabel:`Create Payment` button.
The payment can be registered by clicking the :guilabel:`Pay` button. This brings up the
:guilabel:`Pay` pop-up form, which is auto-populated with the necessary information. When ready,
click the :guilabel:`Create Payment` button.
After clicking :guilabel:`Create Payment`, Odoo reveals the customer invoice, now with a green
:guilabel:`In Payment` or :guilabel:`Paid` banner in the upper-right corner, depending on how the
database has configured and if manual confirmation of payments is required. The process is now
complete, and the 100% down payment has been successfully applied.
:guilabel:`In Payment` banner in the upper-right corner.
.. image:: down_payment/100p-invoice.png
:align: center
:alt: Customer Invoice with a green In Payment banner located in the upper-right corner.
The process is now complete, and the 100% down payment has been successfully applied.
.. _sales/invoicing/income-account-modification:
Income account modification on down payments
============================================
.. important::
To change or adjust the income account attached to down payments, the **Accounting** app must be
installed. With the **Accounting** app installed, the :guilabel:`Accounting` column becomes
available on the draft invoice.
To change or adjust the income account attached to the :guilabel:`Down Payment` product page, the
*Accounting* app **must** be installed.
Navigate to the invoice to be modified by going to :menuselection:`Sales app --> Orders --> Orders`.
Open an order, then click the :guilabel:`Invoices` smart button. Open an invoice, click the
drop-down arrow on the entry in the :guilabel:`Account` column and click :guilabel:`Search more...`
to bring up the :guilabel:`Search: Account` form. In this form, a different account can be chosen
from the list of pre-existing accounts. A new account can also be created by clicking the
:guilabel:`New` button.
Navigate to the :guilabel:`Products` page (:menuselection:`Sales app --> Products --> Products`),
search for the `Down Payment` product in the search bar, and select it to reveal the product detail
page.
With the *Accounting* app installed, the :guilabel:`Accounting` tab becomes available on the product
page.
In the :guilabel:`Accounting` tab, the income account can be changed in the :guilabel:`Income
Account` field, located in the :guilabel:`Receivables` section.
.. image:: down_payment/income-account.png
:alt: The Search:Account form with existing accounts displayed and a button to create a new
account.
:align: center
:alt: How to modify the income account link to down payments.
.. seealso::
:doc:`invoicing_policy`

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

View File

@@ -1,62 +1,16 @@
:nosearch:
:show-content:
:hide-page-toc:
:show-toc:
=========
eCommerce
=========
Build and run your open-source online store with Odoo eCommerce. Create your products, customize the
ordering and checkout process, configure delivery methods, handle sales and delivery orders, create
customer accounts, and monitor your performance.
Run a modern open-source online store with Odoo eCommerce. Learn how to sell online, promote
products and increase your average cart sizes.
.. cards::
.. card:: Products
:target: ecommerce/products
:large:
Configure your product pages, adjust the shop page layout, set up the pricing, and define
suggestions for optional and accessory products.
.. card:: Ordering and checkout
:target: ecommerce/checkout
:large:
Customize the ordering and checkout process with the website editor to fit your business needs.
.. card:: Delivery
:target: ecommerce/shipping
:large:
Enable and configure delivery methods to provide your customers with one or multiple options
upon checkout.
.. card:: Order handling
:target: ecommerce/order_handling
:large:
Handle all business documents related to your eCommerce orders: sales orders, delivery orders,
invoices, and legal requirements.
.. card:: Customer accounts
:target: ecommerce/customer_accounts
:large:
Define your customers' login process and grant portal access to all
users or a select group.
.. card:: Performance management
:target: ecommerce/performance
Analyze sales data to evaluate your eCommerce performance.
.. card:: Google Merchant Center
:target: ecommerce/google_merchant_center
Manage and submit your product data to Google with Google Merchant Center.
.. note::
.. important::
Odoo offers a :ref:`free custom domain name <domain-name/register>` to all Odoo Online databases
for one year. Visitors can then access your website with an address such as `www.example.com`
rather than the default `example.odoo.com`.

View File

@@ -803,10 +803,9 @@ In a similar way, you can add more complex
A Python constraint is defined as a method decorated with
:func:`~odoo.api.constrains`, and invoked on a recordset. The decorator
specifies which fields are involved in the constraint. The constraint is
automatically evaluated at the end of transaction when any of these fields
are modified. The method is expected to raise an exception if its invariant
is not satisfied::
specifies which fields are involved in the constraint, so that the constraint is
automatically evaluated when one of them is modified. The method is expected to
raise an exception if its invariant is not satisfied::
from odoo.exceptions import ValidationError

View File

@@ -86,7 +86,7 @@ to make more complex checks which require Python code. In this case we need a Py
A Python constraint is defined as a method decorated with
:func:`~odoo.api.constrains` and is invoked on a recordset. The decorator
specifies which fields are involved in the constraint. The constraint is automatically evaluated
at the end of transaction when any of these fields are modified. The method is expected to
when any of these fields are modified . The method is expected to
raise an exception if its invariant is not satisfied::
from odoo.exceptions import ValidationError